如何停止Spring Security自动生成密码?自定义实现代码无效
解决Spring Security自动生成密码的问题
你已经实现了自定义UserDetailsService但仍出现自动生成密码的情况,核心原因是Spring Security仍在使用默认的内存用户配置,没有正确绑定你的自定义实现。以下是解决步骤:
1. 编写Security配置类,绑定自定义UserDetailsService
创建Spring Security配置类,显式指定使用你的用户服务和密码编码器,替代默认配置:
@Configuration @EnableWebSecurity public class SecurityConfig { private final CustomUserServiceImplementation userDetailsService; // 构造注入自定义UserDetailsService public SecurityConfig(CustomUserServiceImplementation userDetailsService) { this.userDetailsService = userDetailsService; } @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http .authorizeHttpRequests(auth -> auth .anyRequest().authenticated() // 所有请求需要认证 ) .formLogin(form -> form.permitAll()) // 允许所有人访问登录页 .logout(logout -> logout.permitAll()); // 允许所有人访问登出页 return http.build(); } @Bean public AuthenticationProvider authenticationProvider() { DaoAuthenticationProvider authProvider = new DaoAuthenticationProvider(); // 绑定自定义UserDetailsService authProvider.setUserDetailsService(userDetailsService); // 设置密码编码器,根据实际加密方式选择 authProvider.setPasswordEncoder(passwordEncoder()); return authProvider; } @Bean public PasswordEncoder passwordEncoder() { // 生产环境推荐使用BCrypt加密 return new BCryptPasswordEncoder(); // 测试时若用明文密码,可临时使用(不推荐生产): // return NoOpPasswordEncoder.getInstance(); } }
2. 关键注意事项
- 确保你的
CustomUserServiceImplementation类名遵循Java驼峰命名规范(首字母大写),Spring能正确扫描到@Service注解 - 数据库中存储的用户密码必须是对应
PasswordEncoder加密后的字符串,比如用BCryptPasswordEncoder加密后的结果 - 确认
UserRepository的findByEmail方法能正确从数据库查询到用户
完成以上配置后,Spring Security会使用你的自定义用户服务加载用户,不再生成默认的随机密码。
内容的提问来源于stack exchange,提问作者Mohammed Fazil
相关产品推荐
相关产品推荐

