1. 概述

在实际开发中,我们经常会遇到这样的场景:在某些环境(比如测试环境)中希望临时关闭 Spring Security,以便快速验证接口逻辑,避免反复登录或处理权限问题。

本文将介绍一种简单粗暴但有效的方式 —— 如何针对指定的 Spring Profile 禁用 Spring Security 的全部安全拦截。⚠️ 注意:这不仅仅是跳过认证,而是彻底关闭包括 CSRF、XSS 在内的所有防护机制,仅建议用于非生产环境

2. 安全配置关闭实现

要全局禁用 Spring Security 的请求拦截,最直接的方式是注册一个 WebSecurityCustomizer 类型的 Bean,并通过 ignoring() 方法忽略所有路径的请求。

✅ 示例代码如下:

@Configuration
public class ApplicationNoSecurity {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
            .requestMatchers(new AntPathRequestMatcher("/**"));
    }
}

📌 解释一下关键点:

  • WebSecurityCustomizer 是 Spring Security 5.4+ 推荐用于配置静态资源或完全忽略某些请求的方式。
  • requestMatchers(new AntPathRequestMatcher("/**")) 表示匹配所有 HTTP 请求路径。
  • 被 ignore 的请求将完全绕过 Spring Security 的过滤器链,不进行任何认证、授权检查。

⚠️ 踩坑提醒:这种方式会关闭所有安全机制,包括:

  • 认证(Authentication)
  • 授权(Authorization)
  • CSRF 防护
  • XSS 防护
  • 安全头(Security Headers)

所以千万不要在生产环境使用!

3. 按 Profile 条件化启用

上面的配置是无差别关闭安全机制。为了控制影响范围,我们可以让它只在特定 Profile 下生效

假设我们的单元测试使用了名为 test 的 Profile(即通过 @ActiveProfiles("test") 启动),那么可以通过 @Profile 注解限定配置类的加载条件:

@Configuration
@Profile("test")
public class ApplicationNoSecurity {

    @Bean
    public WebSecurityCustomizer webSecurityCustomizer() {
        return (web) -> web.ignoring()
            .requestMatchers(new AntPathRequestMatcher("/**"));
    }
}

这样,只有当 Spring 应用以 test Profile 启动时,该配置才会生效,其他环境(如 devprod)仍保留完整的安全防护。

🔄 对比方案:保留安全并使用测试支持

虽然禁用 Security 很方便,但也有副作用 —— 你的测试可能无法真实反映带权限系统的运行情况

更推荐的做法是在测试中保留 Security,并利用 Spring Security 提供的测试工具,例如:

  • @WithMockUser
  • @WithUserDetails
  • SecurityMockMvcRequestPostProcessors

这些注解可以让你在不启动真实登录流程的前提下模拟用户身份,既能保证测试效率,又能验证安全逻辑是否正确。

👉 更多相关内容可参考官方文档中关于 方法级安全测试 的说明。

4. 总结

本文演示了如何通过 WebSecurityCustomizer + @Profile 的组合,实现仅在指定 Profile 下关闭 Spring Security 的功能。

📌 核心要点回顾:

  • 使用 web.ignoring().requestMatchers() 可绕过整个 Security 过滤器链 ✅
  • 结合 @Profile("test") 实现环境隔离,避免误用于生产 ❌
  • 禁用 Security 会带来安全隐患,仅限非生产环境使用 ⚠️
  • 更优雅的测试方式是保留 Security 并使用其测试支持工具 🛠️

完整示例代码已托管至 GitHub:https://github.com/baeldung/spring-boot-tutorials/tree/master/spring-boot-security


原始标题:Disable Security for a Profile in Spring Boot | Baeldung