简述
本节讨论Spring Security在基于Servlet的应用程序中的高级体系结构。
Filters
Spring Security的Servlet支持是基于Servlet过滤器的,所以先了解下 Filter 是有帮助的。
Filter(过滤器),功能就是对请求进行一些预处理或后处理,一次请求可以存在有多个过滤器,因为过滤器只影响下游的过滤器和Servlet,所以调用每个过滤器的顺序非常重要。
当多个Filter在一起的时候,需要一个链条把他们连接在一起,进行顺序调用,这个链条就叫 FilterChain
。FilterChain
是servlet容器提供给开发人员的一个对象,它提供了对资源过滤请求的调用链视图,就相当于把一堆Filter按顺序放在FilterChain里。Filter通过调用FilterChain来进行多个过滤器的流转,当Filter是最后一个过滤器时,则会调用其末尾的资源。
FilterChain使用示例:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) {
// 做一些预处理动作
chain.doFilter(request, response); // invoke the rest of the application
// 做一些后处理动作
}
单个HTTP请求的处理程序的典型分层:
DelegatingFilterProxy
Spring提供了一个名为DelegatingFilterProxy
的Filter实现,它允许在Servlet容器的生命周期和Spring的ApplicationContext之间建立桥接。
Servlet容器允许使用自己的标准注册过滤器,但它不知道Spring定义的bean。 DelegatingFilterProxy可以通过标准的Servlet容器机制注册,但是将所有工作委托给实现Filter的Spring Bean。
简单理解就是允许将完整的Spring bean定义机制应用到Filter实例。或者,将标准Filter设置与从Spring根应用程序上下文(Spring root application context)中查找服务bean结合起来。
下图是将DelegatingFilterProxy融入过滤器和过滤器链的图片:
FilterChainProxy
FilterChainProxy是Spring Security提供的一个特殊过滤器,将Filter请求委托给spring管理的过滤器bean列表。由于FilterChainProxy是一个Bean,它通常被包装在DelegatingFilterProxy中。
从3.1版开始,FilterChainProxy使用一个SecurityFilterChain实例列表来配置,每个实例包含一个RequestMatcher和一个应该应用于匹配请求的过滤器列表。大多数应用程序只包含一个过滤器链,如果使用名称空间,则不必显式设置链。
下图展示FilterChainProxy:
SecurityFilterChain
定义一个过滤器链,它能够被匹配到一个HttpServletRequest。FilterChainProxy使用SecurityFilterChain来确定应该为此请求调用哪个Spring安全过滤器。
SecurityFilterChain中的Security Filters通常是bean,但它们是用FilterChainProxy而不是DelegatingFilterProxy注册的。
在Servlet容器中,仅根据URL调用Filters。然而,FilterChainProxy可以通过利用RequestMatcher
接口来决定基于HttpServletRequest中的任何调用。
SecurityFilterChain图:
Security Filters
使用SecurityFilterChain API将安全过滤器插入到FilterChainProxy中。过滤器的顺序很重要。通常不需要知道Spring Security过滤器的顺序。然而,有时知道顺序是有益的。
下面是Spring安全过滤器的综合列表:
- ChannelProcessingFilter
- WebAsyncManagerIntegrationFilter
- SecurityContextPersistenceFilter
- HeaderWriterFilter
- CorsFilter
- CsrfFilter
- LogoutFilter
- OAuth2AuthorizationRequestRedirectFilter
- Saml2WebSsoAuthenticationRequestFilter
- X509AuthenticationFilter
- AbstractPreAuthenticatedProcessingFilter
- CasAuthenticationFilter
- OAuth2LoginAuthenticationFilter
- Saml2WebSsoAuthenticationFilter
- UsernamePasswordAuthenticationFilter
- OpenIDAuthenticationFilter
- DefaultLoginPageGeneratingFilter
- DefaultLogoutPageGeneratingFilter
- ConcurrentSessionFilter
- DigestAuthenticationFilter
- BearerTokenAuthenticationFilter
- BasicAuthenticationFilter
- RequestCacheAwareFilter
- SecurityContextHolderAwareRequestFilter
- JaasApiIntegrationFilter
- RememberMeAuthenticationFilter
- AnonymousAuthenticationFilter
- OAuth2AuthorizationCodeGrantFilter
- SessionManagementFilter
- ExceptionTranslationFilter
- FilterSecurityInterceptor
- SwitchUserFilter