AuthenticationProvider的实现类中注入不了spring对象和BCryptPasswordEncoder验证账号问题

本文介绍了SpringSecurity在实现AuthenticationProvider时遇到的空指针异常问题,解决办法是在构造器中注入依赖。同时,讲解了BCryptPasswordEncoder的特性,强调在密码校验时必须使用match函数来判断密码是否匹配,而不是直接比较加密后的字符串。认证过程中,UsernamePasswordAuthenticationToken仅作为信息载体,需要额外的验证步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值