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,登录失败。
核心原因
- 密码未加密存储:用户注册时直接将明文密码存入数据库,但Spring Security配置了
BCryptPasswordEncoder,验证时会检查密码是否符合BCrypt加密格式,明文显然不匹配,触发报错。 - 认证配置未生效:
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
相关产品推荐
相关产品推荐

