Servlet Security 体系结构

小小码农 2021年10月17日 842次浏览

简述

本节讨论Spring Security在基于Servlet的应用程序中的高级体系结构。

Filters

Spring Security的Servlet支持是基于Servlet过滤器的,所以先了解下 Filter 是有帮助的。

Filter(过滤器),功能就是对请求进行一些预处理或后处理,一次请求可以存在有多个过滤器,因为过滤器只影响下游的过滤器和Servlet,所以调用每个过滤器的顺序非常重要。

当多个Filter在一起的时候,需要一个链条把他们连接在一起,进行顺序调用,这个链条就叫 FilterChainFilterChain是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请求的处理程序的典型分层:

filterchain.png

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融入过滤器和过滤器链的图片:

delegatingfilterproxy.png

FilterChainProxy

FilterChainProxy是Spring Security提供的一个特殊过滤器,将Filter请求委托给spring管理的过滤器bean列表。由于FilterChainProxy是一个Bean,它通常被包装在DelegatingFilterProxy中。

从3.1版开始,FilterChainProxy使用一个SecurityFilterChain实例列表来配置,每个实例包含一个RequestMatcher和一个应该应用于匹配请求的过滤器列表。大多数应用程序只包含一个过滤器链,如果使用名称空间,则不必显式设置链。

下图展示FilterChainProxy:

filterchainproxy.png

SecurityFilterChain

定义一个过滤器链,它能够被匹配到一个HttpServletRequest。FilterChainProxy使用SecurityFilterChain来确定应该为此请求调用哪个Spring安全过滤器。

SecurityFilterChain中的Security Filters通常是bean,但它们是用FilterChainProxy而不是DelegatingFilterProxy注册的。

在Servlet容器中,仅根据URL调用Filters。然而,FilterChainProxy可以通过利用RequestMatcher接口来决定基于HttpServletRequest中的任何调用。

SecurityFilterChain图:

securityfilterchain.png

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