升级已弃用的WebSecurityConfigurerAdapter后,如何禁用Spring自动生成密码
问题解决:Spring Security配置SecurityFilterChain后仍生成默认密码
核心原因
你的配置仅定义了请求授权规则,但未提供自定义的用户认证逻辑(如UserDetailsService),Spring Security的自动配置会补全默认的用户认证Bean,从而生成随机密码。即使排除SecurityAutoConfiguration,UserDetailsServiceAutoConfiguration仍会生效,导致默认密码出现。
解决方案
1. 添加自定义用户认证Bean
在SecurityConfig中添加UserDetailsService Bean,定义自己的用户和角色,覆盖默认配置:
@Configuration @EnableWebSecurity public class SecurityConfig { @Bean public SecurityFilterChain filterChain(HttpSecurity http) throws Exception { http.csrf().disable(); http.authorizeHttpRequests() .requestMatchers("/auth/**").permitAll() .requestMatchers("/role1/**", "/role2/**", "/role3/**").hasAnyRole("ADMIN") .anyRequest().permitAll(); return http.build(); } // 添加自定义用户认证Bean @Bean public UserDetailsService userDetailsService() { UserDetails admin = User.withUsername("admin") .password("{noop}admin123") // {noop}表示不加密,生产环境需替换为BCrypt等加密方式 .roles("ADMIN") .build(); return new InMemoryUserDetailsManager(admin); } }
2. 正确排除自动配置类
如果不需要默认的用户认证自动配置,需同时排除SecurityAutoConfiguration和UserDetailsServiceAutoConfiguration:
@SpringBootApplication(exclude = { SecurityAutoConfiguration.class, UserDetailsServiceAutoConfiguration.class }) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
注意事项
- 生产环境不要使用
{noop}明文密码,需替换为PasswordEncoder加密,比如BCrypt:
此时用户密码需改为加密后的值:@Bean public PasswordEncoder passwordEncoder() { return new BCryptPasswordEncoder(); }.password(passwordEncoder().encode("admin123"))
内容的提问来源于stack exchange,提问作者Amir Khanalipour
相关产品推荐
相关产品推荐

