第 48 章 配置过滤器

48.1. 标准过滤器

下面是命名空间所支持的所有过滤器名称,类型,位置,以及在命名空间中对应的配置。

表 48.1. 标准过滤器别名和顺序

别名过滤器类命名空间元素或属性
CHANNEL_FILTERChannelProcessingFilterhttp/intercept-url@requires-channel
SECURITY_CONTEXT_FILTERSecurityContextPersistenceFilterhttp
CONCURRENT_SESSION_FILTERConcurrentSessionFilter session-management/concurrency-control
LOGOUT_FILTER LogoutFilterhttp/logout
X509_FILTER X509AuthenticationFilterhttp/x509
PRE_AUTH_FILTER AstractPreAuthenticatedProcessingFilter SubclassesN/A
CAS_FILTER CasAuthenticationFilterN/A
FORM_LOGIN_FILTER UsernamePasswordAuthenticationFilterhttp/form-login
BASIC_AUTH_FILTER BasicAuthenticationFilterhttp/http-basic
SERVLET_API_SUPPORT_FILTERSecurityContextHolderAwareRequestFilterhttp/@servlet-api-provision
JAAS_API_SUPPORT_FILTERJaasApiIntegrationFilterhttp/@jaas-api-provision
REMEMBER_ME_FILTER RememberMeAuthenticationFilterhttp/remember-me
ANONYMOUS_FILTER AnonymousAuthenticationFilterhttp/anonymous
SESSION_MANAGEMENT_FILTERSessionManagementFiltersession-management
EXCEPTION_TRANSLATION_FILTER ExceptionTranslationFilterhttp
FILTER_SECURITY_INTERCEPTOR FilterSecurityInterceptorhttp
SWITCH_USER_FILTER SwitchUserFilterN/A

上面的表格中列出了命名空间中支持的所有标准过滤器以及它们对应的顺序,这些过滤器的顺序是至关重要的,只有按照正确的顺序进行配置才能让这些过滤器正常发挥作用,在ACEGI的年代有太多太多的问题都是由于过滤器摆放的位置不正确造成的。幸好我们现在可以使用命名空间,它会帮我们将使用到的过滤器按照正确的方式摆放在一起。

48.2. 在http中启用标准过滤器

如果我们什么也不配置,只使用<http>标签的话,也会有五个默认的过滤器被创建出来,并放到过滤器链中。它们是:

SecurityContextPersistenceFilter
SecurityContextHolderAwareRequestFilter
ExceptionTranslationFilter
SessionFixationProtectionFilter
FilterSecurityInterceptor
        

如果追求最小的过滤器链,可以为<http>标签加上servlet-api-provision="false"。

<http entry-point-ref="authenticationEntryPoint"
      servlet-api-provision="false"
      session-fixation-protection="none"/>
        

这样就会禁用SecurityContextHolderAwareRequestFilter和SessionFixationProtectionFilter两个过滤器,只剩下三个过滤器会被自动创建了。

这三个过滤器在系统中拥有十分特殊的含义,它们三个是命名空间限定的最核心过滤器,如果我们使用了命名空间的配置方式,那么这三个过滤器就是不可替换的,如果使用了<custom-filter position="FILTER_SECURITY_INTERCEPTOR" />妄图替换其中任何一个过滤器,都会抛出异常,从而导致系统无法启动。

如果在<http>中设置了auto-config="true"就会默认启用多个常用的过滤器,实际上<http auto-config="true">就相当于如下配置:

<http>
  <form-login />
  <http-basic />
  <logout />
</http>
        

使用auto-config="true"就等于在<http>中添加了五个标签,同时会启用“用户注销”,“基于表单认证”,“http basic认证”,“记忆登录信息”,“匿名认证”五个功能。这五个功能的实际效果可以参考第 11 章 图解过滤器

48.3. 为自定义过滤器设置位置

如果我们要自定义一个过滤器,就需要使用custom-filter标签,将过滤器加入过滤器链中才能实际起作用。在custom-filter中可以使用以下设置好的位置:

"FIRST"
| "CHANNEL_FILTER"
| "CONCURRENT_SESSION_FILTER"
| "SECURITY_CONTEXT_FILTER"
| "LOGOUT_FILTER"
| "X509_FILTER"
| "PRE_AUTH_FILTER"
| "CAS_FILTER"
| "FORM_LOGIN_FILTER"
| "OPENID_FILTER"
| "BASIC_AUTH_FILTER"
| "SERVLET_API_SUPPORT_FILTER"
| "REMEMBER_ME_FILTER"
| "ANONYMOUS_FILTER"
| "EXCEPTION_TRANSLATION_FILTER"
| "SESSION_MANAGEMENT_FILTER"
| "FILTER_SECURITY_INTERCEPTOR"
| "SWITCH_USER_FILTER"
| "LAST"
        

在custom-filter中可以使用before|position|after三种方式,将自定义过滤器放在对应名称的位置上,或者位置之前,或者位置之后。除了表示最前面的FIRST和表示最后面的LAST之外,这里的每个名称都对应着一个标准过滤器,我们可以在上面的章节中找到其对应的位置,要记住SESSION_CONTEXT_INTEGRATION_FILTER, EXCEPTION_TRANSLATION_FILTER和FILTER_SECURITY_INTERCEPTOR三个过滤器是不可替换的,不能对它们使用position。