Spring WebSecurityCustomizer 的作用
Spring WebSecurityCustomizer
是 Spring Security 框架中用来 自定义 Web 安全配置 的一个接口。 它的主要作用是在开发中我们能够 精细的控制哪些请求会被 Spring Security 完全忽略,不进行任何安全检查和过滤。
我们可以把它想象成是 Spring Security 大门上的一个 “后门” 或者 “快速通道”。
-
Spring Security 的大门: 默认情况下,应用启用了 Spring Security,所有的 HTTP 请求都会经过 Spring Security 的重重安全检查 (例如:身份认证、权限校验、CSRF 防护等等)。 这就像你家的大门,任何访客都要经过你的检查才能进入。
-
WebSecurityCustomizer
的 “后门” / “快速通道”:WebSecurityCustomizer
允许你配置一些特定的 URL 路径,这些路径就像是 “后门” 或 “快速通道”,请求可以直接绕过 Spring Security 的所有安全检查,直接进入你的应用内部。 这就好比你设置了某些人可以直接从后门进入你家,无需经过大门的检查。
WebSecurityCustomizer
主要用于配置以下场景:
-
静态资源放行 (Static Resources): 例如 CSS 文件、JavaScript 文件、图片、字体文件等等。 这些静态资源通常是公开访问的,不需要进行身份验证或权限控制。 通过
WebSecurityCustomizer
可以配置忽略对这些静态资源的拦截,提升性能,避免不必要的安全处理。- 例如:
/css/**
,/js/**
,/images/**
这些路径下的所有请求都直接放行,不经过 Spring Security 的检查。
- 例如:
-
公开 API 或端点 (Public APIs/Endpoints): 有些 API 接口或端点是设计为公开访问的,例如网站的首页、登录页面、注册页面、或者一些无需授权即可访问的公共数据接口。
WebSecurityCustomizer
可以用来配置忽略对这些公开 API 的安全检查。- 例如:
/public-api/**
,/login
,/register
这些路径下的请求被忽略。
- 例如:
-
健康检查端点 (Health Check Endpoints): 在微服务架构中,健康检查端点通常需要被监控系统定期访问,以判断服务是否正常运行。 这些端点通常也应该公开访问,不需要安全验证。
- 例如:
/health
,/actuator/health
这些健康检查端点被忽略。
- 例如:
为什么要使用 WebSecurityCustomizer
而不是其他 Spring Security 配置方式?
-
完全忽略安全检查:
WebSecurityCustomizer
的关键在于 完全忽略 指定路径的 Spring Security 安全处理。 这意味着这些路径的请求 不会经过任何 Spring Security 的过滤器链。 这与SecurityFilterChain
的配置不同,SecurityFilterChain
是用来 配置如何进行安全处理 (例如:认证方式、授权规则等),而不是完全忽略。 -
性能优化: 对于不需要安全检查的路径,使用
WebSecurityCustomizer
可以避免不必要的安全处理开销,提升应用的性能。
如何使用 WebSecurityCustomizer
?
开发中我们需要创建一个实现了 WebSecurityCustomizer
接口的 Bean,并在 customize(WebSecurity web)
方法中进行配置。 通常使用 web.ignoring()
方法来指定需要忽略的路径模式。
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.WebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityCustomizer;
@Configuration
public class WebSecurityConfig {
@Bean
public WebSecurityCustomizer webSecurityCustomizer() {
return new WebSecurityCustomizer() {
@Override
public void customize(WebSecurity web) {
web.ignoring()
// 忽略所有 /css/**, /js/**, /images/** 下的请求
.antMatchers("/css/**", "/js/**", "/images/**")
// 忽略 /public-api/ 开头的请求
.antMatchers("/public-api/**")
// 忽略 /health 端点
.antMatchers("/health");
}
};
}
}
总结:
Spring WebSecurityCustomizer
的作用是:
- 配置 Spring Security 完全忽略的 URL 路径。
- 用于放行静态资源、公开 API、健康检查端点等不需要安全检查的请求。
- 通过
web.ignoring()
方法进行配置。 - 与
SecurityFilterChain
不同,它不是用来配置安全处理规则,而是完全跳过安全处理。 - 可以提升应用的性能,避免不必要的安全处理开销。