No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuth

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。 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值