SpringSecurity认证失败ProviderNotFoundException:UsernamePasswordAuthenticationToken

新写了一个项目,spring boot整合spring security时密码认证失败,报了一个ProviderNotFoundException进到了failureHandler的else里面

org.springframework.security.authentication.ProviderNotFoundException: 
No AuthenticationProvider found for org.springframework.security.authentication.UsernamePasswordAuthenticationToken

我定义了一个接口IUsersService,在IUsersService继承了UserDetailsService。

定义了一个UsersServiceImpl实现类实现IUsersService的loadUserByUsername方法。

在debug时,发现没有进到loadUserByUsername这个方法,

.failureHandler((request, response, exception) -> {
    response.setContentType(MediaType.APPLICATION_JSON_UTF8_VALUE);
    RespBean respBean=null;
    if(exception instanceof BadCredentialsException){
        respBean=RespBean.error("用户名或密码不正确");
    }else if(exception instanceof DisabledException){
        respBean=RespBean.error("用户被禁用");
    }else {
        exception.printStackTrace();
    }
    response.getWriter().write(new ObjectMapper().writeValueAsString(respBean));
})

解决方法一

在过滤器链指定HttpSecurity的userDetailsService

    @Bean
    SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception {
        http
                .userDetailsService(usersService)
                .authorizeRequests()
                .antMatchers("/**").authenticated()
                .and().formLogin()
                .loginProcessingUrl("/login")

解决方法二

这个报错本质上的错误,是使用接口继承了UserDetailsService,然后再实现这个接口

而不是在实现类直接实现UserDetailsService;

表面上看没什么问题,但是SpringBoot不会发现这个UserDetailsService的实现类UsersServiceImpl。

解决方法就是将UsersServiceImpl间接实现UserDetailsService改为UsersServiceImpl直接实现UserDetailsService即可

public interface IUsersService extends IService<Users>, UserDetailsService {

}

改为如下:

@Service
public class UsersServiceImpl extends ServiceImpl<UsersMapper, Users> implements IUsersService, UserDetailsService {

    @Override
    public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException {
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值