《Spring Security》第十章 SpringSecurity中的过滤器链

第十章 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 过滤器的顺序

  1. ChannelProcessingFilter
    1. 可以重定向到不同的协议
  2. SecurityContextPersistenceFilter
    1. 在web请求开始及结束时,将HttpSession复制到SecurityContext
  3. ConcurrentSessionFilter
    1. 当session更新时,通过 SessionRegistry 来更新 SecurityContextHolder
    2. 并更新 Principal
  4. Authentication processing machanisms
    1. 认证处理机制
    2. UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、BasicAuthenticationFilter等等
    3. 用于向 SecurityContextHolder填充Authentication令牌
  5. SecurityContextHolderAwareRequestFilter
  6. JassApiIntegrationFilter
    1. 用于处理 JassAuthenticationToken,并将其放入SecurityContextHolder
  7. RememberMeAuthenticationFilter
    1. 如果没有其他身份更新 SecurityContextHolder,会尝试请求是否有RememberMe 的cookie,并生成一个Authentication 放入SecurityContextHolder
  8. AnonymousAuthenticationFilter
    1. 如果没有其他身份更新 SecurityContextHolder,则会存储一个匿名对象
  9. ExceptionTranslationFilter
    1. 捕获任何Spring Security 异常,并返回适当的Http响应
    2. 可以由 AuthenticationEntryPoint 抛出
  10. FilterSecurityInterceptor
    1. 保护web uri,并在拒绝访问时引发异常
文章作者: koral
文章链接: http://luokaiii.github.io/2019/07/22/读书笔记/《SpringSecurity》/10.过滤器链/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自