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

迁移至Spring Boot 2遇问题:编码密码不符合BCrypt格式

解决Spring Boot 2.0迁移后BCrypt密码验证失败无法获取令牌的问题

我之前也碰到过完全一样的问题——从Spring Boot 1.5.9(对应Spring Security 4)迁移到2.0版本后,原本用BCrypt存储的密码突然无法通过验证,控制台抛出Encoded password does not look like BCrypt的警告,导致拿不到授权令牌。根源在于Spring Security 5引入了默认的DelegatingPasswordEncoder,它要求存储的密码必须带上算法前缀(比如{bcrypt})才能识别加密类型,而你在1.5版本里存储的BCrypt密码是没有这个前缀的。

下面给你两种可行的解决方案:

方案1:更新数据库中的密码(推荐)

这是最符合Spring Security 5规范的做法,给所有已存储的BCrypt加密密码添加{bcrypt}前缀。比如原来的密码是:

$2a$10$Z8HkX9Y6G7F5D3S1A2B4C5...

修改后变成:

{bcrypt}$2a$10$Z8HkX9Y6G7F5D3S1A2B4C5...

修改完成后,Spring Security会自动识别前缀并使用BCrypt算法验证密码,无需额外配置。

方案2:配置直接使用BCryptPasswordEncoder(无需修改数据库)

如果你暂时没办法修改数据库中的密码,可以通过配置让Spring Security跳过前缀检查,直接使用BCryptPasswordEncoder作为默认密码编码器:

  1. 在你的Spring配置类中定义PasswordEncoder Bean:
@Bean
public PasswordEncoder passwordEncoder() {
    // 直接返回BCryptPasswordEncoder,不使用DelegatingPasswordEncoder
    return new BCryptPasswordEncoder();
}
  1. 确保在授权服务器的配置中引用这个编码器,比如在AuthorizationServerEndpointsConfigurer里指定:
@Override
public void configure(AuthorizationServerEndpointsConfigurer endpoints) throws Exception {
    endpoints.authenticationManager(authenticationManager)
             .passwordEncoder(passwordEncoder()); // 注入上面定义的BCryptPasswordEncoder
}

额外排查点

  • 确认你的构建配置中Spring Security的版本是5.x(Spring Boot 2.0默认引入的版本),没有混装旧版本的依赖。
  • 如果你的OAuth2客户端的secret也是用BCrypt加密的,同样需要处理前缀问题,或者确保客户端配置中使用的编码器和上面一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.20 08:08:48