Spring Security 源码分析九:Java config - 阶段性总结

栏目: 后端 · 发布时间: 4年前

内容简介:本文是对 Spring Security Core 4.0.4 Release 进行源码分析的系列文章之一;本博文是有关 Spring Security 的配置相关的内容的阶段性总结;本文为作者的原创作品,转载需注明出处;

本文是对 Spring Security Core 4.0.4 Release 进行源码分析的系列文章之一;

本博文是有关 Spring Security 的配置相关的内容的阶段性总结;

本文为作者的原创作品,转载需注明出处;

总结

概念设计

Spring Security 源码分析九:Java config - 阶段性总结

笔者将千言万语汇集成了上面这张图;从左至右,

  1. DelegatingFilterProxy( FilterChainProxy )

    DelegatingFilterProxy 是六大Web Servlet Filters 之一;它的目的就是将不同的访问请求转发到对应的 SecurityFilterChain 上;比如,将 /web/** 请求转发到 SecurityFilterChain A 上,将 /foo/** 转发到 SecurityFilterChain B 上;

  2. SecurityFilterChain

    从上述的概念图中可以清晰的看到,它主要是由两部分构成;

    Filters

    Spring Security 的安全链正是由这样的一个个的 Filters 所构成的;比如笔者前文所介绍到的CsrfFilter、 BasicAuthenticationFilterUsernamePasswordAuthenticationFilter 等等;不过要注意 Filters 的几个特点,

    ① 这些 Filters 都是某个 SecurityFilterChain 的私有对象;

    ② 这些 Filters 都共享 Shared Objects 中所缓存的对象实例;

    Shared Objects

    顾名思义,被共享的对象,只是要注意的是,这些对象的作用范围都只针对某一个 SecurityFilterChain ;其核心目就是将这些共享对象让 SecurityFilterChain 中的多个 Filters 对象所调用;典型的对象有 AuthenticationManagerBuilderAuthenticationManager 等;

实现逻辑

各个实体之间的关联关系分析

Spring Security 源码分析九:Java config - 阶段性总结

上述的类图总结了 Spring Security 整体的核心实现逻辑;如图,分为三块,

  1. WebSecurity

    WebSecurity 的核心目的是依赖于用户自定义配置的 WebSecurityConfigurer 生成一个全局唯一的SecurityChainProxy对象;WebSecurity 与 SecurityChainProxy 是一对一的关系;

  2. HttpSecurity

    HttpSecurity 的核心目的是依赖于用户自定义配置的 AbstractHttpConfigurer 而生成不同的 Filters,最终由这些 Filters 构成 SecurityFilterChain 对象并返回;也就是说,一个 HttpSecurity 将会生成一个 SecurityFilterChain 对象并返回;HttpSecurity 与 SecurityFilterChain 是一对一的关系;

  3. AuthenticationManagerBuilder

    顾名思义,AuthenticationManagerBuilder 就是用来生成 AuthenticationManager 的,不过这里的逻辑并没有图示中的那么简单,在 Spring Security 源码分析九:Java config - AuthenticationManagerBuilder 一文中,笔者专门系统的分析了 AuthenticationManagerBuilder 生成 AuthenticationManager 的流程,它是通过一个“全局的 AuthenticationManagerBuilder”和一个“局部的 AuthenticationManagerBuilder”来生成 AuthenticationManager 的,“全局的 AuthenticationManagerBuilder”将会负责生成一个“全局的 AuthenticationManager”,“局部的 AuthenticationManagerBuilder”将会生成一个 HttpSecurity 私有的“局部的 AuthenticationManager”;“全局的 AuthenticationManagerManager”是作为 parent auth manager 赋值给所有的“局部的 AuthenticationManagerBuilder”,当“局部的 AuthenticationManager”验证失败以后,将会使用“全局的 AuthenticationManagerManager”来进行验证;

交互关系

同样,笔者将千言万语汇聚成了下面这样的一张图,这张图包含了配置和构建的两部分逻辑;

Spring Security 源码分析九:Java config - 阶段性总结

  • 配置和加载的逻辑

    先将焦点汇聚在左上角,WebConfiguration 通过 @EnableWebSecurity 注解加载用户的配置类 WebSecurityConfig 和 RestSecurityConfig,同时初始化 WebSecurity 单实例对象;此部分逻辑参考 Spring Security 源码分析九:Java config - WebSecurity & @EnableWebSecurity

  • 构建逻辑

    将焦点放置到右侧和右下侧,从步骤 ❸ 开始,通过调用 WebSecurity.build() 方法启动 WebSecurity 的构建流程;

    WebSecurity init process

    该 init process 的过程中,会 初始化 HttpSecurity 并加载用户通过 WebSecurityConfig 和 RestSecurityConfig 自定义的有关 HttpSecurity 的配置 ,同时会 初始化 Local Authentication Manager Builder

    WebSecurity configure process

    提供了扩展 WebSecurity 对象的入口;一般而言,无需进行扩展;

    WebSecurity perform build process

    此步骤的最终目的是创建出 FilterChianProxy 对象,不过要能创建出 FilterChianProxy 的前提是执行 HttpSecurity 创建出对应的 SecurityFilterChain;所以,此步骤中的逻辑是最复杂的,对应执行流程第 ❺ 步;首先遍历 HttpSecurity 对象,然后依次对其执行构建动作,构建过程中,分别执行 hConfigurers 的 init、configure 和 perform build 流程,这里尤其重要的是 configure 的流程,一方面 将构建安全链的 Filter 对象 (见步骤 ❼ ),另外一方法,在执行 pre configure 的时候(见步骤 ❻ ),将会 创建出 Authentication Manager ;最后,由 HttpSecurity 的 perform build 流程返回 SecurityFilterChain 对象,并最终由 WebSecurity 的 perform build 流程生成 SecurityChainProxy 对象并返回;

写在最后

WebConfiguration 起到的作用就是初始化 WebSecurity 以及相关对象,并串联 WebSecurity 与用户的自定义配置类 WebSecurityConfigurer;然后,通过 WebSecurity 的构建流程生成最为重要的 FilterChainProxy 对象,在构建的过程中,又通过执行 HttpSecurity 和 AuthenticationManagerBuilder 的构建流程分别生成对应的 SecurityFilterChain 和 AuthenticationManager 对象;而这里所构造出来的相关对象实例之间的对应关系为 FilterChainProxy 与 SecurityFilterChain 是一对多的关系,而 SecurityFilterChain 与 AuthenticationManager 是一对一的关系,且都是 聚合关系


以上所述就是小编给大家介绍的《Spring Security 源码分析九:Java config - 阶段性总结》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

写给大忙人看的Java SE 8

写给大忙人看的Java SE 8

【美】Cay S. Horstmann(凯.S.霍斯曼) 编 / 张若飞 / 电子工业出版社 / 2014-11 / 59.00元

《写给大忙人看的Java SE 8》向Java开发人员言简意赅地介绍了Java 8 的许多新特性(以及Java 7 中许多未被关注的特性),《写给大忙人看的Java SE 8》延续了《快学Scala》“不废话”的风格。 《写给大忙人看的Java SE 8》共分为9章。第1章讲述了lambda表达式的全部语法;第2章给出了流的完整概述;第3章给出了使用lambda表达式设计库的有效技巧;第4章......一起来看看 《写给大忙人看的Java SE 8》 这本书的介绍吧!

RGB转16进制工具
RGB转16进制工具

RGB HEX 互转工具

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

RGB CMYK 转换工具
RGB CMYK 转换工具

RGB CMYK 互转工具