You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

DaoAuthenticationProvider密码加密由什么控制?登录报BadCredentialsException如何解决

问题1:DaoAuthenticationProvider的密码加密逻辑控制组件

DaoAuthenticationProvider的密码校验、加密逻辑完全由你注入的PasswordEncoder接口实现类控制,你当前配置中注入的是BCryptPasswordEncoder,因此所有密码哈希对比、校验逻辑都由该类实现。
校验时DaoAuthenticationProvider会调用passwordEncoder.matches(用户登录输入的明文密码, 数据库存储的加密哈希),返回true则校验通过,否则抛出BadCredentialsException。

问题2:异常排查与解决方法

你当前代码中存在一个直接导致校验失败的明显错误,可按以下步骤排查修复:

  • 第一步:修复UserDetailsServiceImpl的错误代码
    你在返回User对象时,对数据库取出的加密哈希做了toLowerCase()处理:
    return new org.springframework.security.core.userdetails.User(
      user.getName(), user.getPassword().toLowerCase(), enabled, accountNonExpired,
      credentialsNonExpired, accountNonLocked, getAuthorities(userService.listRolesForUserName(userName)));
    
    BCrypt生成的加密哈希是大小写敏感的,强制转小写会导致哈希值完全失效,直接返回user.getPassword()即可,不要做额外的大小写转换。
  • 第二步:验证密码存储逻辑一致性
    确认用户注册、密码修改场景下,使用的是同一个配置(strength=11)的BCryptPasswordEncoder实例对明文密码做哈希,哈希生成后不要做大小写转换、多余的字符裁剪等操作再存入数据库。
  • 第三步:手动校验哈希匹配性
    测试环境下可打印用户输入的明文密码、数据库存储的原始加密哈希,手动调用以下代码验证是否匹配:
    BCryptPasswordEncoder encoder = new BCryptPasswordEncoder(11);
    // 输出true则匹配,false则说明哈希生成逻辑存在问题
    System.out.println(encoder.matches("用户输入的明文密码", "数据库存储的原始哈希"));
    
  • 第四步:排查字符编码问题
    确认密码输入、存储、读取全链路的字符编码一致,不存在中文、特殊字符转码错误导致的密码不匹配问题。

内容的提问来源于stack exchange,提问作者bcr666

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 20:24:03