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

Spring授权登录报错:Encoded password does not look like BCrypt 如何解决?

Spring Security登录报错:Encoded password does not look like BCrypt解决方法

问题现象

实现Spring授权功能时,访问localhost:8080/login,输入用户名user和密码password(确认用户已存在),提交后控制台报错Encoded password does not look like BCrypt,登录失败。

核心原因

  1. 密码未加密存储:用户注册时直接将明文密码存入数据库,但Spring Security配置了BCryptPasswordEncoder,验证时会检查密码是否符合BCrypt加密格式,明文显然不匹配,触发报错。
  2. 认证配置未生效:WebSecurityConfig中的configure(AuthenticationManagerBuilder auth)方法未被Spring正确调用——该方法缺少@Autowired注解,导致UserDetailsService和PasswordEncoder未关联到认证管理器。

解决步骤

步骤1:修改注册逻辑,加密密码

在用户注册流程中,使用BCryptPasswordEncoder对密码加密后再存入数据库。

修改UserController.java:

@Controller
public class UserController {
    // 原有代码保持不变

    @Autowired
    private BCryptPasswordEncoder passwordEncoder; // 注入密码编码器

    @PostMapping("/registrate")
    public String registrateUser(@Valid User user, Map<String, Object> map){
        User userFromDatabase = userRepository.findByUsername(user.getUsername());
        if(userFromDatabase != null){
            map.put("message", "User has been already registrated!");
            return registratePage;
        }
        user.setCreatedDate(Instant.now());
        user.setRoles(Collections.singleton(Role.USER));
        user.setPassword(passwordEncoder.encode(user.getPassword())); // 新增:加密密码
        userRepository.save(user);
        map.put("message", "User has been successfully registrated!");
        return redirectLoginPage;
    }
}

步骤2:修正认证配置,确保生效

修改WebSecurityConfig.java,给configure方法添加@Autowired注解,让Spring自动调用该方法完成认证配置:

@Configuration
@EnableWebSecurity
public class WebSecurityConfig{
    @Autowired
    private UserService userService;

    // securityFilterChain方法保持不变

    // 修改:添加@Autowired注解,将方法改为public
    @Autowired
    public void configure(AuthenticationManagerBuilder auth) throws Exception{
        auth.userDetailsService(userService).passwordEncoder(passwordEncoder());
    }

    @Bean
    public BCryptPasswordEncoder passwordEncoder() {
        return new BCryptPasswordEncoder();
    }
}

步骤3:重新创建用户并测试

  • 删除数据库中已存在的user用户(原密码为明文,无法通过BCrypt验证)
  • 访问/registrate重新注册用户,此时密码会被加密存储
  • 使用新注册的用户登录,即可正常通过认证

可选:Spring Security 5.7+最新配置方式

如果使用基于SecurityFilterChain的最新配置模式,可直接在securityFilterChain方法中整合认证逻辑,替代configure(AuthenticationManagerBuilder)方法:

@Bean
public SecurityFilterChain securityFilterChain(HttpSecurity http, AuthenticationManagerBuilder auth) throws Exception {
    // 配置认证逻辑
    auth.userDetailsService(userService).passwordEncoder(passwordEncoder());

    http
        .authorizeHttpRequests((requests) -> requests
            .antMatchers("/", "/index", "/users", "/registrate", "/deleteuser/**", "/webjars/**").permitAll()
            .anyRequest().authenticated()
        )
        .formLogin((form) -> form
            .loginPage("/login")
            .permitAll()
        )
        .logout((logout) -> logout.permitAll());

    return http.build();
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 15:25:19