public interface SecurityFilterChain {
// 匹配请求
boolean matches(HttpServletRequest request);
// 获取该 SecurityFilterChain 中的所有 Filter
List getFilters();
}
复制代码
具体来说,当请求到达FilterChainProxy时,其内部会根据当前请求匹配得到对应的SecurityFilterChain,然后将请求依次转发给到该SecurityFilterChain中的所有 Security Filters。如下图所示:
Security Filters
Spring Security 最终对请求进行处理的就是某个SecurityFilterChain中的 Security Filters,这些Filter都设置为 Bean 注入到 Spring容器中,且这些Filters 的先后顺序很重要。以下是 Spring Security 内置的完整 Security Filter 顺序列表:
-
ChannelProcessingFilter:确保请求投递到要求渠道。最常见的使用场景就是指定哪些请求必须使用HTTPS 协议,哪些请求必须使用 HTTP 协议,哪些请求随便使用哪种协议均可。
-
WebAsyncManagerIntegrationFilter:集成SecurityContext到 Spring Web 异步请求机制中的WebAsyncManager。
-
注:SecurityContext就是 安全上下文,主要职能就是用于存储用户认证的一些信息。
-
SecurityContextPersistenceFilter:在每次请求处理之前,从 Session(默认使用HttpSessionSecurityContextRepository)中获取SecurityContext,然后将其设置给到SecurityContextHolder;在请求结束后,就会将SecurityContextHolder中存储的SecurityContext重新保存到 Session 中,并且清除SecurityContextHolder中的SecurityContext。
-
SecurityContextPersistenceFilter可以通过HttpSecurity#securityContext()及相关方法引入其配置对象SecurityContextConfigurer来进行配置。
-
HeaderWriterFilter:该过滤器可为响应添加一些响应头,比如添加X-Frame-Options,X-XSS-Protection和X-Content-Type-Options等响应头,让浏览器开启保护功能。
-
HeaderWriterFilter可以通过HttpSecurity#headers()来定制。
-
CorsFilter:处理跨域资源共享(CORS)。
-
CorsFilter可以通过HttpSecurity#cors()来定制。
-
CsrfFilter:处理跨站请求伪造(CSRF)。
-
CsrfFilter可以通过HttpSecurity#csrf()来开启或关闭。在前后端分离项目中,不需要使用 CSRF。
-
LogoutFilter:处理退出登录请求。
-
LogoutFilter可以通过HttpSecurity#logout()来定制退出逻辑。
-
OAuth2AuthorizationRequestRedirectFilter:用于构建 OAuth 2.0 认证请求,将用户请求重定向到该认证请求接口。
-
注:该过滤器需要添加spring-security-oauth2等相关模块。
-
Saml2WebSsoAuthenticationRequestFilter:基于 SAML 的 SSO 单点登录认证请求过滤器。
-
注:Saml2WebSsoAuthenticationRequestFilter需要添加 Spring Security SAML 模块。
-
X509AuthenticationFilter:X509 认证过滤器。
-
X509AuthenticationFilter可以通过Securit