第十章 SpringSecurity中的过滤器链
Spring Security 的 web 基础完全是基于标准的 servlet 过滤器的,它在内部不使用 servlet 或任何基于 servlet 的框架(如SpringMVC),因此它与任何特定的 web 技术都没有特别强的关联。
Spring Security 不关心请求是来自于 浏览器、web服务器、HttpInvoker 还是 ajax应用。
在 Spring Security 的 HttpSecurityBuilder 类的 addFilter(Filter filter) 上,存在这样一段注解:
/**
* Adds a {@link Filter} that must be an instance of or extend one of the Filters
* provided within the Security framework. The method ensures that the ordering of the
* Filters is automatically taken care of.
*
* The ordering of the Filters is:
*
* <ul>
* <li>{@link ChannelProcessingFilter}</li>
* <li>{@link ConcurrentSessionFilter}</li>
* <li>{@link SecurityContextPersistenceFilter}</li>
* <li>{@link LogoutFilter}</li>
* <li>{@link X509AuthenticationFilter}</li>
* <li>{@link AbstractPreAuthenticatedProcessingFilter}</li>
* <li><a href="{@docRoot}/org/springframework/security/cas/web/CasAuthenticationFilter.html">CasAuthenticationFilter</a></li>
* <li>{@link UsernamePasswordAuthenticationFilter}</li>
* <li>{@link ConcurrentSessionFilter}</li>
* <li>{@link OpenIDAuthenticationFilter}</li>
* <li>{@link org.springframework.security.web.authentication.ui.DefaultLoginPageGeneratingFilter}</li>
* <li>{@link ConcurrentSessionFilter}</li>
* <li>{@link DigestAuthenticationFilter}</li>
* <li>{@link BasicAuthenticationFilter}</li>
* <li>{@link RequestCacheAwareFilter}</li>
* <li>{@link SecurityContextHolderAwareRequestFilter}</li>
* <li>{@link JaasApiIntegrationFilter}</li>
* <li>{@link RememberMeAuthenticationFilter}</li>
* <li>{@link AnonymousAuthenticationFilter}</li>
* <li>{@link SessionManagementFilter}</li>
* <li>{@link ExceptionTranslationFilter}</li>
* <li>{@link FilterSecurityInterceptor}</li>
* <li>{@link SwitchUserFilter}</li>
* </ul>
*
* @param filter the {@link Filter} to add
* @return the {@link HttpSecurity} for further customizations
*/
H addFilter(Filter filter);
DelegatingFilterProxy
在 Spring Security 中,过滤器类也是在应用上下文中定义的 Bean,因此能够充分利用 Spring 的依赖注入工具和生命周期接口。
DelegatingFilterProxy 提供了 web.xml 和应用程序上下文之间的关联。
<!-- 当使用DelegatingFilterProxy时,可以在 web.xml 中看到如下内容 -->
<filter>
<filter-name>myFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>myFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
Filter Ordering 过滤器的顺序
- ChannelProcessingFilter
- 可以重定向到不同的协议
- SecurityContextPersistenceFilter
- 在web请求开始及结束时,将HttpSession复制到SecurityContext
- ConcurrentSessionFilter
- 当session更新时,通过 SessionRegistry 来更新 SecurityContextHolder
- 并更新 Principal
- Authentication processing machanisms
- 认证处理机制
- UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、BasicAuthenticationFilter等等
- 用于向 SecurityContextHolder填充Authentication令牌
- SecurityContextHolderAwareRequestFilter
- JassApiIntegrationFilter
- 用于处理 JassAuthenticationToken,并将其放入SecurityContextHolder
- RememberMeAuthenticationFilter
- 如果没有其他身份更新 SecurityContextHolder,会尝试请求是否有RememberMe 的cookie,并生成一个Authentication 放入SecurityContextHolder
- AnonymousAuthenticationFilter
- 如果没有其他身份更新 SecurityContextHolder,则会存储一个匿名对象
- ExceptionTranslationFilter
- 捕获任何Spring Security 异常,并返回适当的Http响应
- 可以由 AuthenticationEntryPoint 抛出
- FilterSecurityInterceptor
- 保护web uri,并在拒绝访问时引发异常