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

Spring Boot登录反复报「Encoded password does not look like BCrypt」错误

报错本质

该异常由Spring Security的BCryptPasswordEncoder校验逻辑触发:在比对用户输入的密码与数据库存储的密码前,加密器会先验证数据库取出的密码值是否符合BCrypt加密的固定结构(必须以$2a$/$2b$/$2y$开头,固定长度60位),结构校验不通过时直接抛出该异常,不会进入明文哈希比对环节。

常见触发原因

结合你提供的项目代码,报错大概率来自以下几类场景:

  • 数据库现存的测试用户密码不符合BCrypt格式。
    你在/do_register接口中已经实现了密码加密存储逻辑,但测试阶段手动插入数据库的用户、或是通过旧版本无加密逻辑的代码写入的用户,其密码字段为明文值,完全不具备BCrypt的格式特征,是触发该报错的最常见原因。
  • 加密器Bean冲突。
    你在MyConfiguration中手动注册了BCryptPasswordEncoder实例,如果项目其他配置类中还定义了其他类型的PasswordEncoderBean,可能导致Spring Security校验密码时加载的加密器,和注册时使用的加密器不是同一套实现,最终格式校验不通过。
  • 用户详情加载逻辑存在缺陷。
    项目中的UserDetailsServiceImpl如果在加载用户信息时,对数据库取出的密码字段做了额外转换(比如错误解密、手动覆写为明文),会导致传给加密器校验的密码值不符合BCrypt格式。
修复步骤
  • 第一,校验数据库存储的密码格式
    查询测试用登录用户的密码字段:如果不是以$2a$开头的60位加密字符串,直接删除该用户重新走注册流程创建新账号,新账号的密码会自动经过BCrypt加密后存入数据库;也可以手动将测试用户的密码更新为标准BCrypt格式的加密值,完成测试验证。
  • 第二,排查Bean注册冲突
    全局检索项目中所有PasswordEncoder类型的Bean定义,确保仅存在MyConfiguration中声明的BCrypt加密器实例,无重复定义。可在注册逻辑中增加日志,打印实际存储到数据库的加密密码值,确认与登录校验环节使用的加密器为同一实例生成。
  • 第三,核对用户详情加载逻辑
    检查UserDetailsServiceImpl的实现,确保从数据库取出用户实体后,不对密码字段做任何修改,直接将原值传入UserDetails对象的密码字段,不做额外转换操作。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 20:54:05