zoukankan      html  css  js  c++  java
  • 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 也是按照上面的顺序调用过滤器,可能会跳过一些过滤器,但上面的顺序固定的。后面的文章会说明常用过滤器的功能。

  • 相关阅读:
    BZOJ 1093: [ZJOI2007]最大半连通子图
    BZOJ 1406: [AHOI2007]密码箱
    BZOJ 1073: [SCOI2007]kshort
    BZOJ 1857: [Scoi2010]传送带
    AC日记——天天爱跑步 洛谷 P1600
    AC日记——[Sdoi2010]粟粟的书架 bzoj 1926
    AC日记——The Shortest Path in Nya Graph hdu 4725
    AC日记——文化之旅 洛谷 P1078
    AC日记——【模板】分块/带修改莫队(数颜色) 洛谷 P1903
    AC日记——大爷的字符串题 洛谷 P3709
  • 原文地址:https://www.cnblogs.com/colin220/p/15743067.html
Copyright © 2011-2022 走看看