一、
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只是一个对象属性集合,并不会自动判断是否通过认证。需要加独立判断。