DaoAuthenticationProvider密码加密由什么控制?登录报BadCredentialsException如何解决
问题1:DaoAuthenticationProvider的密码加密逻辑控制组件
DaoAuthenticationProvider的密码校验、加密逻辑完全由你注入的PasswordEncoder接口实现类控制,你当前配置中注入的是BCryptPasswordEncoder,因此所有密码哈希对比、校验逻辑都由该类实现。
校验时DaoAuthenticationProvider会调用passwordEncoder.matches(用户登录输入的明文密码, 数据库存储的加密哈希),返回true则校验通过,否则抛出BadCredentialsException。
问题2:异常排查与解决方法
你当前代码中存在一个直接导致校验失败的明显错误,可按以下步骤排查修复:
- 第一步:修复
UserDetailsServiceImpl的错误代码
你在返回User对象时,对数据库取出的加密哈希做了toLowerCase()处理:
BCrypt生成的加密哈希是大小写敏感的,强制转小写会导致哈希值完全失效,直接返回return new org.springframework.security.core.userdetails.User( user.getName(), user.getPassword().toLowerCase(), enabled, accountNonExpired, credentialsNonExpired, accountNonLocked, getAuthorities(userService.listRolesForUserName(userName)));user.getPassword()即可,不要做额外的大小写转换。 - 第二步:验证密码存储逻辑一致性
确认用户注册、密码修改场景下,使用的是同一个配置(strength=11)的BCryptPasswordEncoder实例对明文密码做哈希,哈希生成后不要做大小写转换、多余的字符裁剪等操作再存入数据库。 - 第三步:手动校验哈希匹配性
测试环境下可打印用户输入的明文密码、数据库存储的原始加密哈希,手动调用以下代码验证是否匹配:BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(11); // 输出true则匹配,false则说明哈希生成逻辑存在问题 System.out.println(encoder.matches("用户输入的明文密码", "数据库存储的原始哈希")); - 第四步:排查字符编码问题
确认密码输入、存储、读取全链路的字符编码一致,不存在中文、特殊字符转码错误导致的密码不匹配问题。
内容的提问来源于stack exchange,提问作者bcr666
相关产品推荐
相关产品推荐

