1. 概述

Spring Security 提供多种机制配置请求模式为非安全状态或允许无限制访问。本文将深入探讨两种常用方法:permitAll()web.ignoring(),并解析它们在 Spring Security 中的工作原理。

核心要点

  • permitAll():允许访问但保留安全过滤器
  • web.ignoring():完全绕过安全过滤器链
  • ⚠️ 两者适用场景有本质区别

2. 使用 permitAll() 配置访问权限

通过 permitAll() 配置允许所有请求访问指定路径,但不会禁用安全过滤器。这确保了 Spring Security 相关功能(如日志记录、会话管理、CSRF 保护)仍然生效。

Java 配置示例

http.authorizeHttpRequests(authorizationManagerRequestMatcherRegistry ->
  authorizationManagerRequestMatcherRegistry
    .requestMatchers("/login*").permitAll()
);

关键特性

  • 适用于需要部分安全功能的场景(如登录页)
  • 保留 CSRF 令牌等安全机制
  • 安全过滤器链仍会处理请求

3. 使用 web.ignoring() 禁用安全过滤器

通过 web.ignoring() 可完全排除特定路径的安全过滤器链处理。此方法适用于完全不需要安全处理的场景,例如静态资源服务。

Java 配置示例

web.ignoring().antMatchers("/resources/**");

典型应用场景

  • 静态资源(图片/CSS/JS 文件)
  • 公开 API 接口
  • 健康检查端点

重要限制

  • ❌ 丧失所有 Spring Security 功能(日志/CSRF/会话管理等)
  • ⚠️ 仅用于绝对信任的路径

4. web.ignoring() 的使用陷阱

使用 web.ignoring() 时,定义顺序至关重要。必须将具体路径定义在通用模式(如 /**)之前。

错误配置示例

// 错误:通用模式优先定义
web.ignoring().antMatchers("/**");  // 会覆盖后续配置
web.ignoring().antMatchers("/resources/**"); // 永远不会生效

典型异常

Caused by: java.lang.IllegalArgumentException: A universal match pattern ('/**') 
is defined  before other patterns in the filter chain, causing them to be ignored. 
Please check the ordering in your <security:http> namespace or FilterChainProxy bean configuration
    at o.s.s.c.h.DefaultFilterChainValidator.checkPathOrder(DefaultFilterChainValidator.java:49)
    at o.s.s.c.h.DefaultFilterChainValidator.validate(DefaultFilterChainValidator.java:39)

正确配置原则

  1. ✅ 先定义具体路径(如 /api/public/**
  2. ✅ 后定义通用路径(如 /**
  3. ❌ 避免在通用路径后定义具体路径

5. 总结

本文对比了 Spring Security 中两种开放访问路径的核心方法:

特性 permitAll() web.ignoring()
安全过滤器 保留 完全移除
适用场景 需要部分安全功能的路径 完全信任的静态资源
CSRF 保护 ✅ 生效 ❌ 失效
配置顺序敏感度 高(需注意路径优先级)

实践建议

  • 登录页/公开 API → 优先用 permitAll()
  • 静态资源 → 用 web.ignoring()
  • 混合场景 → 考虑拆分多个安全配置

选择合适的方法既能满足业务需求,又能避免安全漏洞。记住:安全配置无小事,顺序错了全白费


原始标题:Spring Security - access permitAll, filters none, security none | Baeldung