上篇回顾

  • 框架的核心是一个过滤器,这个过滤器名字springSecurityFilterChain类型FilterChainProxy
  • WebSecurityHttpSecurity都是建造者
  • WebSecurity构建目标是FilterChainProxy对象
  • HttpSecurity的构建目标仅仅是FilterChainProxy中的一个SecurityFilterChain
  • @EnableWebSecurity注解,导入了WebSecurityConfiguration
  • WebSecurityConfiguration中创建了建造者对象WebSecurity,和核心过滤器FilterChainProxy

WebSecurityConfiguration开始

WebSecurityConfiguration中需要关注两个方法:

  1. setFilterChainProxySecurityConfigurer()
    

    方法

    创建了WebSecurity建造者对象,用于后面建造FilterChainProxy过滤器

  2. springSecurityFilterChain()
    

    方法

    调用WebSecurity.build(),建造出FilterChainProxy过滤器对象

WebSecurity的创建过程:setFilterChainProxySecurityConfigurer()方法

该方法负责收集配置类对象列表webSecurityConfigurers,并创建WebSecurity

  1. @Value("#{}") 是SpEl表达式通常用来获取bean的属性或者调用bean的某个方法。

  2. 方法执行时,会先得到webSecurityConfigurers并排序(所有实现了WebSecurityConfigurerAdapter的配置类实例)

  3. newwebsecurity对象,并使用Spring的容器工具初始化

  4. 判断webSecurityConfigurers内元素的@Order是否有相同,相同的order会抛异常。

    默认order等于LOWEST_PRECEDENCE = 2147483647(参考Integer order = AnnotationAwareOrderComparator.lookupOrder(config)

  5. WebSecurityConfigurerAdapter的子类apply()放入websecurityList<SecurityConfigurer<O, B>> configurersAddedInInitializing中。

下图是通过AutowiredWebSecurityConfigurersIgnoreParentsgetWebSecurityConfigurers()方法,获取所有实现WebSecurityConfigurer的配置类

FilterChainProxy的创建过程:springSecurityFilterChain()方法

springSecurityFilterChain()方法中调用webSecurity.build()创建了FilterChainProxy

PS:根据下面代码,我们可以知道如果创建的MySecurityConfig类没有被sping扫描到,

框架会新new 出一个WebSecurityConfigureAdapter对象,这会导致我们配置的用户名和密码失效。


我们继续看FilterChainProxy的创建过程:

WebSecurity`是一个建造者,所以我们去看这些方法`build(); doBuild(); init(); configure(); performBuild();

build()方法定义在WebSecurity对象的父类AbstractSecurityBuilder中:

build()方法会调用WebSecurity对象的父类AbstractConfiguredSecurityBuilder#doBuild()

doBuild()先调用init();configure();等方法

我们上面已经得知了configurersAddedInInitializing里是所有的配置类对象

如下图,这里会依次执行配置类的configure();init()方法

这里的 this.configurers就是前面webSecurity.apply(webSecurityConfigurer);注入的webSecurityConfigurer

doBuild()最后调用了WebSecurity对象的perfomBuild(),来创建了FilterChainProxy对象

performBuild()里遍历securityFilterChainBuilders建造者列表

把每个SecurityBuilder建造者对象构建成SecurityFilterChain实例

最后创建并返回FilterChainProxy

securityFilterChainBuilders建造者列表是什么时候初始化的呢

这时候要注意到WebSecurityConfigurerAdapter,这个类的创建了HttpSecurity并放入了securityFilterChainBuilders

WebSecurityConfigurerAdapter是一个安全配置器,我们知道建造者在performBuild()之前都会把循环调用安全配置器init();configure();方法,然后创建HttpSecurity并放入自己的securityFilterChainBuilders里。

  • init()方法传入 WebSecurity init()方法有调用getHttp() ,getHttp()里面调用configure(HttpSecurity http)

    父类中有默认的时效方法,所以你不覆盖就会有默认的认证方式

    protected void configure(HttpSecurity http) throws Exception {logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");http.authorizeRequests().anyRequest().authenticated().and().formLogin().and().httpBasic();}
    
  • AbstractConfiguredSecurityBuilder 中调用configure()

    configurer.configure((B) this);
    

    将 WebSecurity 传入 WebSecurityConfigurerAdapterconfigure(WebSecurity http)方法

PS: 前面已经提到了,在WebSecurity初始化时,会依次将WebSecurityConfigurerAdapter的子类放入WebSecurity

public abstract class WebSecurityConfigurerAdapter implementsWebSecurityConfigurer<WebSecurity> {}
public interface WebSecurityConfigurer<T extends SecurityBuilder<Filter>> extendsSecurityConfigurer<Filter, T> {}

深入浅出Spring Security(二):FilterChainProxy的创建过程相关推荐

  1. Spring Security(二):OAuth2协议

    ​ Spring Security(二):OAuth2.0协议 活动地址:CSDN21天学习挑战赛 今天学习与研究了OAuth2.0协议,记录一下,方便后面查阅 OAuth2.0即是一个开放标准,我们 ...

  2. Spring容器初始化和bean创建过程

    文章目录 Spring容器初始化过程(注解) 1.this() 初始化bean读取器和扫描器 2. register(annotatedClasses) 3 refresh()刷新上下文 前言:一直想 ...

  3. 深入浅出Spring Security(三):FilterChainProxy的运行过程

    上篇回顾 我们已经知道了Spring Security的核心过滤器的创建和原理,本文主要介绍核心过滤器FilterChainProxy是如何在tomcat的ServletContext中生效的. Se ...

  4. Spring 源码解析 - Bean创建过程 以及 解决循环依赖

    一.Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDef ...

  5. Spring - 手把手分析 IoC 容器创建过程

    概述 这里我们以 Spring 5.2.8.RELEASE 版本为例,看一下 IoC 容器 的创建过程.同时我们使用 java-based 的方式实例化 IoC 容器,即使用 AnnotationCo ...

  6. Android资源管理框架(二)AssetManager创建过程

     Android应用程序在运行的过程中,是通过一个称为AssetManager的资源管理器来读取打包在APK文件里面的资源文件的.在本文中,我们就将详细分析Android应用程序资源管理器的创建以 ...

  7. 深入浅出Spring Security(一):三句话解释框架原理

    三句话解释框架原理 整个框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain类型是FilterChainProxy 核心过滤器里面是过滤器链(列表),过滤器链的每 ...

  8. spring之二——使用maven创建一个java project

    2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了,安装可以看这篇博客: http://www.blogjava ...

  9. Spring Security OAuth2.0认证授权知识概括

    Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...

最新文章

  1. checkIP.sh
  2. ASP.NET MVC5 Entity Framework CodeFirst(代码优先)
  3. 一 Struts2 开发流程
  4. Logica实战与剖析(1)
  5. oracle星形转换,Oracle数据仓库博客(转,学)
  6. gravity、layout_gravity及orientation
  7. 2012 Java陷阱
  8. app vue 真机运行_使用 HBuilder 将 Vue 项目打包成手机 App
  9. jenkins即将重启问题
  10. Unity3D界面功能操作讲解【转http://www.cnblogs.com/fortomorrow/archive/2012/10/28/unity01.html】...
  11. .NET Framework(一)
  12. Android 四大组件学习之Service六
  13. 20200716每日一句
  14. Windows 10中无需禁用强制驱动签名检测加载驱动
  15. 世界各国Google域名后缀对照表
  16. 2022智源大会议程丨AI平台与系统专题论坛
  17. windows10 插入耳机无弹出,无声音,提示扬声器、耳机未插入
  18. 《2018秋招小结》
  19. 小小靖Java成长日记02
  20. c语言进阶编程 培训,大学C语言进阶编程实例.doc

热门文章

  1. 生化医学文章模式图素材
  2. 东北黑土区不同纬度农田土壤真菌分子生态网络的比较
  3. Annu. Rev. Genet:植物微生物组——系统性见解与展望
  4. R算数运算符:+、-、*、/、%%、%/%、^
  5. Logstic与Softmax比较
  6. asp连接mysql odbc,在ASP中连接MySQL数据库的方法,最好的通过ODBC方法
  7. 使用XML记录数据的一些体会
  8. day04 JDBC java数据库连接
  9. 用C语言编程 限定输入的年月日,C语言程序设计: 输入年月日 然后输出是星期几...
  10. java如何使实验箱蜂鸣器响_按键按一次蜂鸣器响一次的单片机程序