14.3. Filter 排序
在 filter chain 定義好的順序是非常重要的,不論你實際使用哪些 filter,順序都應該如下:
ChannelProcessingFilter:因為此 filter 負責轉導到不同的協定 (protocol)SecurityContextPersistenceFilter:此 filter 需排在此,如此才能在請求的一開始就將SecurityContext設定到SecurityContextHolder當中,而且SecurityContext的任何變動才能在請求結束 (準備好給下一次請求使用) 時複製到HttpSession當中ConcurrentSessionFilter:此 filter 會使用SecurityContextHolder的功能,而且會更新SessionRegistry以反應請求端 (principal) 持續進行的請求- 驗證處理機制:
UsernamePasswordAuthenticationFilter、CasAuthenticationFilter、BasicAuthenticationFilter等等,如此SecurityContextHolder才能將通過驗證的Authentication請求 token 包含在內 SecurityContextHolderAwareRequestFilter:如果你要使用這個 filter 來將 Spring Security 的 awareHttpServletRequestWrapper安裝到你的 servlet 容器中- Spring Security 的 aware 其實是繼承
javax.servlet.http.HttpServletRequestWrapper的org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestWrapper
- Spring Security 的 aware 其實是繼承
JaasApiIntegrationFilter:如果SecurityContextHolder當中有一個JaasAuthenticationToken,此 filter 會將FilterChain當成JaasAuthenticationToken裡面的Subject處理RememberMeAuthenticationFilter:當沒有更前面的執行的驗證機制對SecurityContextHolder做更新,而且該請求提供了一個允許記得我功能啟動的 cookie,則此 filter 會將一個合適的Authentication物件放到SecurityContextHolder中AnonymousAuthenticationFilter:當沒有更前面的執行的驗證機制對SecurityContextHolder做更新,一個匿名的Authentication物件會被放到SecurityContextHolder中ExceptionTranslationFilter:此 filter 用來接住任何 Spring Security 的 exceptions,然後回傳一個 HTTP 錯誤回應,或啟動一個合適的AuthenticationEntryPointFilterSecurityInterceptor:保護 URIs 並在訪問被拒絕的時候拋出異常