一、
spring security实现AuthenticationProvider接口@Autowired注入UserDetailsService,报空指针异常。“java.lang.NullPointerException: null”
在AuthenticationProvider的实现类中注入不了spring对象,可以在构造器中注入。
新建一个有参构造器
MyUserService myUserService;
public MyAuthProvider(MyUserService myService){
myUserService = myService;
}
在传入配置方法时就把要传的service单独传进去。
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
// auth.userDetailsService(userSrv);
JdbcUserDetailsManager manager = auth.jdbcAuthentication().dataSource(dataSource).
getUserDetailsService();
auth.authenticationProvider(new MyAuthProvider(userSrv));
}
二、
BCryptPasswordEncoder加密器每次生成的密码不一样,所以不能直接把请求的密码加密后equal。需要用专门的match函数判断是否密码相等。
if(passwordEncoder.matches(encodePass,userDetails.getPassword())){
UsernamePasswordAuthenticationToken authenticationToken = new
UsernamePasswordAuthenticationToken(userDetails.getUsername(),userDetails.getPassword(),userDetails.getAuthorities());
return authenticationToken;
}else {
throw new BadCredentialsException("用户名或密码错误");
}
Note:认证时UsernamePasswordAuthenticationToken只是一个对象属性集合,并不会自动判断是否通过认证。需要加独立判断。
本文介绍了SpringSecurity在实现AuthenticationProvider时遇到的空指针异常问题,解决办法是在构造器中注入依赖。同时,讲解了BCryptPasswordEncoder的特性,强调在密码校验时必须使用match函数来判断密码是否匹配,而不是直接比较加密后的字符串。认证过程中,UsernamePasswordAuthenticationToken仅作为信息载体,需要额外的验证步骤。
1577

被折叠的 条评论
为什么被折叠?



