使用userDetailsS​​ervice的Spring启动安全性

时间:2018-01-15 03:02:41

标签: spring-boot jdbc spring-security

@Service
public class UserDetService implements UserDetailsService{
@Autowired
private UserRepository userRepository;
@Override
public UserDetails loadUserByUsername(String userName) throws UsernameNotFoundException {
    User user = userRepository.findByUserName(userName);
    if(user == null){
        throw new UsernameNotFoundException(userName);
    }
    return new UserPrincipal(user);
}

}

SecConfig.java

@Configuration
@EnableWebSecurity
public class SecConfig extends WebSecurityConfigurerAdapter{
@Bean
public UserDetailsService userDetailsService(){
    return new UserDetService();
}

@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception{
    auth.userDetailsService(userDetailsService());
}
@Override
protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
      .antMatchers("/hello").access("hasRole('ROLE_ADMIN')")  
      .anyRequest().permitAll()
      .and()
        .formLogin().loginPage("/login")
        .usernameParameter("username").passwordParameter("password")
      .and()
        .logout().logoutSuccessUrl("/login?logout") 
       .and()
       .exceptionHandling().accessDeniedPage("/403")
      .and()
        .csrf();
}


}

我正在学习Spring安全性,并没有找到任何人问我是否正确,这是为了确保登录身份验证还是我错过了什么?

此外我还有一个困惑,我没有写任何查询来获取用户名和密码,用户输入和数据库工作的用户名和密码验证如何以及验证发生在哪里?

感谢周围有这么有帮助的人

1 个答案:

答案 0 :(得分:0)

您不需要编写查询,因为如果您使用jpa,它会为您编写查询。

这一行:User user = userRepository.findByUserName(userName);

将使用存储库自动生成查询,以检查提供的参数是否返回任何内容并在您的服务中

if(user == null){
        throw new UsernameNotFoundException(userName);
    }
如果存储库找不到用户,

将抛出错误。

希望这能回答你的问题。