如何移除Spring Boot测试中的“使用默认安全密码”提示?
解决@WebMvcTest测试时出现默认安全密码提示的问题
问题根源
你遇到的提示是Spring Security自动配置触发的:当Spring容器中找不到自定义的UserDetailsService实现类(多模块项目中其他模块未被测试扫描到),且你的安全配置没有明确覆盖用户认证逻辑时,Spring会自动生成一个默认的用户和随机密码。而移除WebSecurityConfig中的authenticationManagerBean() Bean后,原本的自定义安全配置标识消失,触发了这个默认行为。
解决方案
1. 测试环境禁用Spring Security自动配置
直接在@WebMvcTest注解中排除安全自动配置类,彻底关闭测试时的默认安全逻辑:
@WebMvcTest(excludeAutoConfiguration = SecurityAutoConfiguration.class) public class YourControllerTest { // 测试代码 }
或者更精准地排除相关配置:
@WebMvcTest(exclude = {SecurityAutoConfiguration.class, ManagementWebSecurityAutoConfiguration.class})
2. 为测试配置自定义安全规则
如果测试需要保留部分安全逻辑但不想看到默认密码提示,可以编写测试专用的安全配置类:
@TestConfiguration public class TestSecurityConfig { @Bean public SecurityFilterChain securityFilterChain(HttpSecurity http) throws Exception { http.authorizeHttpRequests(auth -> auth.anyRequest().permitAll()) .csrf(csrf -> csrf.disable()); return http.build(); } }
然后在测试类中导入这个配置:
@WebMvcTest @Import(TestSecurityConfig.class) public class YourControllerTest { // 测试代码 }
3. 修复多模块扫描问题
如果测试需要用到真实的UserDetailsService,确保测试能扫描到其他模块的类:
- 在测试类上添加
@ComponentScan(basePackages = "com.other.module.package"),指定其他模块的包路径 - 或者直接用
@Import(YourUserDetailsServiceImpl.class)导入具体的实现类
关于是否可以忽略提示
开发测试阶段可以暂时忽略,但不建议长期这么做:
- 默认密码的存在可能导致测试时接口需要认证,影响测试用例的执行
- 容易混淆生产环境的安全配置认知,增加后续维护风险
为什么移除Bean后出现问题
之前你重写并暴露authenticationManagerBean()时,Spring Security会识别到你有自定义的安全配置(继承WebSecurityConfigurerAdapter),不会触发默认用户生成逻辑;移除该Bean后,你的安全配置没有足够的自定义标识,且容器中找不到UserDetailsService,所以触发了自动配置的默认用户生成。
内容的提问来源于stack exchange,提问作者Lako12
相关产品推荐
相关产品推荐

