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
相关产品推荐
相关产品推荐

