SpringSecurity 问题:No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken
翻译:未找到 org.springframework.security.authentication.UsernamePasswordAuthenticationToken 的 AuthenticationProvider
详解:在使用SpringSecurity框架进行用户验证(将登录用户与数据库数据进行比对时),使用自定义方式认证注册,出现了AuthenticationProvider问题
源代码:
@Component //纳入IoC管理
public class DBUserDetailsConfig implements UserDetailsManager
, UserDetailsPasswordService {
@Autowired //将mapper添加进来
private LoginUserMapper loginUserMapper;
@Override
public UserDetails loadUserByUsername(String username)throws UsernameNotFoundException{
//在数据库里面查询用户名和密码
LoginUser loginUser = loginUserMapper.getLoginUserByLoginName(username);
if (loginUser == null) {
throw new UsernameNotFoundException(username);
}
Collection<GrantedAuthority> grantedAuthorities = new ArrayList<>();
//创建UserDetails对象,返回给类
return
new User(loginUser.getLoginname(),
loginUser.getLoginpassword(),
true,
true,
true,
true,
grantedAuthorities
);
}
}
Security源代码:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
private final DBUserDetailsConfig dbUserDetailsConfig;
@Autowired
public WebSecurityConfig(DBUserDetailsConfig dbUserDetailsConfig) {
this.dbUserDetailsConfig = dbUserDetailsConfig;
}
//将自定义的DBUserDetailsConfig 注册到UserDetailsService 里面
@Bean
public UserDetailsService userDetailsService() {
return dbUserDetailsConfig;
}
}
出现错误:
问题解决方案:
@Configuration
@EnableWebSecurity
public class WebSecurityConfig {
private final DBUserDetailsConfig dbUserDetailsConfig;
@Autowired
public WebSecurityConfig(DBUserDetailsConfig dbUserDetailsConfig) {
this.dbUserDetailsConfig = dbUserDetailsConfig;
}
@Bean
public UserDetailsService userDetailsService() {
return dbUserDetailsConfig;
}
// 以下为添加代码
@Bean //手动的添加AuthenticationProvider ,
public AuthenticationProvider authenticationProvider() {
DaoAuthenticationProvider provider = new DaoAuthenticationProvider();
//只需将参数换为自己的 dbUserDetailsConfig 即可
provider.setUserDetailsService( /*your */);
provider.setPasswordEncoder(passwordEncoder());
return provider;
}
@Bean //以下两个bean可直接复制
public AuthenticationManager authenticationManager(AuthenticationConfiguration authenticationConfiguration) throws Exception {
return authenticationConfiguration.getAuthenticationManager();
}
@Bean
public PasswordEncoder passwordEncoder() {
return new BCryptPasswordEncoder(); // 使用 Bcrypt 进行密码加密
}
}
问题总结:
Spring Security 默认会使用 DaoAuthenticationProvider
进行身份验证,但你的 SecurityConfig
并没有显式注册 AuthenticationProvider
,可能导致找不到合适的 AuthenticationProvider
处理 UsernamePasswordAuthenticationToken
。