Spring Security:(三)架构

官方文档地址

Spring Security 官方文档地址 https://docs.spring.io/spring-security/reference/index.html

其中重点章节是 Servlet Applications 这一章节从 Spring Security 架构到使用都讲述十分详尽。本文是官方文档的阅读笔记。

三个核心类

Spring Security 是通过一系列过滤器链来实现认证和授权功能。多个过滤器有序组合在一起形成过滤器链。Spring Security 是通过下面三个类构建起复杂的功能:

  • DelegatingFilterProxy
  • FilterChainProxy
  • SecurityFilterChain

下文围绕这三个核心类进行展开。

容器中的过滤器

在 Java Web 技术中,有 Servlet Filter Listener 三大组件,三大组件的生命周期都是 Web 容器进行管理的。

Spring 提供了一个名为 DelegatingFilterProxy 的 Filter 实现类,其作用是在 Servlet 容器的生命周期和 Spring 的 ApplicationContext 之间进行桥接。 Servlet 容器允许使用自己的标准注册过滤器,但 Servlet 容器并不会接管 Spring Bean。 DelegatingFilterProxy 可以通过标准 Servlet 容器机制注册,但将所有工作委托给实现 Filter 的 Spring Bean。

因 DelegatingFilterProxy 是一个普通的过滤器,因此当请求到达 Web 容器时,DelegatingFilterProxy 会被调用,接着 DelegatingFilterProxy 会调用 Spring Bean 中实现 Filter 接口的类中方法。因此可以将过滤器分类两类,第一类是由 Web 容器进行管理,第二类是由 Spring 进行管理的,DelegatingFilterProxy 就是连接二者的桥梁。

需要注意的是 DelegatingFilterProxy 是 Spring 框架中类,而非 Spring Security 中。

管理多个过滤器链 

Spring Security 中有个十分核心的 Filter 实现类 FilterChainProxy,其作用是用来管理 Spring Security 中各种过滤器链(并非 Servlet 容器中的过滤器链),可以认为是 Spring Security 功能的入口。FilterChainProxy 被包裹在 DelegatingFilterProxy 中,因此调用时机也由 DelegatingFilterProxy 决定。

Spring 家族中有其他许多成员,各个成员核心功能的入口都不一样,但是涉及到过滤器的功能,无一例外,都是由 DelegatingFilterProxy 进行管理。

Servlet 容器管理 FilterChain,而 FilterChain 管理其中多个过滤器,DelegatingFilterProxy 作为其中一个过滤器也被 FilterChain 管理。DelegatingFilterProxy 又包裹了 FilterChainProxy。

FilterChainProxy 管理一系列名为 SecurityFilterChain 过滤器链。

常用过滤器

SecurityFilterChain 是一个过滤器链,其中包含了许多有序的过滤器(被称为 Security Filter)。Spring Security 中有包含了许多的 SecurityFilterChain,而这些 SecurityFilterChain 调用统一由 FilterChainProxy 决定。

Spring Security 中有许多过滤器,其复杂且强大的功能均由有下面 32 个过滤器实现的(标红的是较为常用的过滤器):

  1. SecurityContextPersistenceFilter
  2. HeaderWriterFilter
  3. CorsFilter
  4. CsrfFilter
  5. LogoutFilter
  6. OAuth2AuthorizationRequestRedirectFilter
  7. Saml2WebSsoAuthenticationRequestFilter
  8. X509AuthenticationFilter
  9. AbstractPreAuthenticatedProcessingFilter
  10. CasAuthenticationFilter
  11. OAuth2LoginAuthenticationFilter
  12. Saml2WebSsoAuthenticationFilter
  13. UsernamePasswordAuthenticationFilter
  14. OpenIDAuthenticationFilter
  15. DefaultLoginPageGeneratingFilter
  16. DefaultLogoutPageGeneratingFilter
  17. ConcurrentSessionFilter
  18. DigestAuthenticationFilter
  19. BearerTokenAuthenticationFilter
  20. BasicAuthenticationFilter
  21. RequestCacheAwareFilter
  22. SecurityContextHolderAwareRequestFilter
  23. JaasApiIntegrationFilter
  24. RememberMeAuthenticationFilter
  25. AnonymousAuthenticationFilter
  26. OAuth2AuthorizationCodeGrantFilter
  27. SessionManagementFilter
  28. ExceptionTranslationFilter
  29. FilterSecurityInterceptor
  30. SwitchUserFilter

Spring Security 也是按照上面的顺序调用过滤器,可能会跳过一些过滤器,但上面的顺序固定的。后面的文章会说明常用过滤器的功能。

原文地址:https://www.cnblogs.com/colin220/p/15743067.html