深入浅出Spring Security(二):FilterChainProxy的创建过程
上篇回顾
- 框架的核心是一个过滤器,这个过滤器
名字
叫springSecurityFilterChain
,类型
是FilterChainProxy
WebSecurity
和HttpSecurity
都是建造者
WebSecurity
构建目标是FilterChainProxy
对象HttpSecurity
的构建目标仅仅是FilterChainProxy
中的一个SecurityFilterChain
。@EnableWebSecurity
注解,导入了WebSecurityConfiguration
类WebSecurityConfiguration
中创建了建造者对象WebSecurity
,和核心过滤器FilterChainProxy
从WebSecurityConfiguration
开始
WebSecurityConfiguration
中需要关注两个方法:
setFilterChainProxySecurityConfigurer()
方法
创建了
WebSecurity
建造者对象,用于后面建造FilterChainProxy
过滤器springSecurityFilterChain()
方法
调用
WebSecurity.build()
,建造出FilterChainProxy
过滤器对象
WebSecurity
的创建过程:setFilterChainProxySecurityConfigurer()
方法
该方法负责收集配置类对象
列表webSecurityConfigurers
,并创建WebSecurity
:
@Value("#{}") 是SpEl表达式通常用来获取bean的属性或者调用bean的某个方法。
方法执行时,会先得到
webSecurityConfigurers
并排序(所有实现了WebSecurityConfigurerAdapter
的配置类实例)
new
出websecurity
对象,并使用Spring的容器工具初始化判断
webSecurityConfigurers
内元素的@Order
是否有相同,相同的order
会抛异常。默认
order
等于LOWEST_PRECEDENCE = 2147483647
(参考Integer order = AnnotationAwareOrderComparator.lookupOrder(config)
)将
WebSecurityConfigurerAdapter
的子类apply()
放入websecurity
的List<SecurityConfigurer<O, B>> configurersAddedInInitializing
中。
下图是通过
AutowiredWebSecurityConfigurersIgnoreParents
的getWebSecurityConfigurers()
方法,获取所有实现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()
方法传入 WebSecurityinit()
方法有调用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 传入
WebSecurityConfigurerAdapter
的configure(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的创建过程相关推荐
- Spring Security(二):OAuth2协议
Spring Security(二):OAuth2.0协议 活动地址:CSDN21天学习挑战赛 今天学习与研究了OAuth2.0协议,记录一下,方便后面查阅 OAuth2.0即是一个开放标准,我们 ...
- Spring容器初始化和bean创建过程
文章目录 Spring容器初始化过程(注解) 1.this() 初始化bean读取器和扫描器 2. register(annotatedClasses) 3 refresh()刷新上下文 前言:一直想 ...
- 深入浅出Spring Security(三):FilterChainProxy的运行过程
上篇回顾 我们已经知道了Spring Security的核心过滤器的创建和原理,本文主要介绍核心过滤器FilterChainProxy是如何在tomcat的ServletContext中生效的. Se ...
- Spring 源码解析 - Bean创建过程 以及 解决循环依赖
一.Spring Bean创建过程以及循环依赖 上篇文章对 Spring Bean资源的加载注册过程进行了源码梳理和解析,我们可以得到结论,资源文件中的 bean 定义信息,被组装成了 BeanDef ...
- Spring - 手把手分析 IoC 容器创建过程
概述 这里我们以 Spring 5.2.8.RELEASE 版本为例,看一下 IoC 容器 的创建过程.同时我们使用 java-based 的方式实例化 IoC 容器,即使用 AnnotationCo ...
- Android资源管理框架(二)AssetManager创建过程
Android应用程序在运行的过程中,是通过一个称为AssetManager的资源管理器来读取打包在APK文件里面的资源文件的.在本文中,我们就将详细分析Android应用程序资源管理器的创建以 ...
- 深入浅出Spring Security(一):三句话解释框架原理
三句话解释框架原理 整个框架的核心是一个过滤器,这个过滤器名字叫springSecurityFilterChain类型是FilterChainProxy 核心过滤器里面是过滤器链(列表),过滤器链的每 ...
- spring之二——使用maven创建一个java project
2019独角兽企业重金招聘Python工程师标准>>> maven的安装及Eclipse maven插件安装这里不再说了,安装可以看这篇博客: http://www.blogjava ...
- Spring Security OAuth2.0认证授权知识概括
Spring Security OAuth2.0认证授权知识概括 安全框架基本概念 基于Session的认证方式 Spring Security简介 SpringSecurity详解 分布式系统认证方 ...
最新文章
- checkIP.sh
- ASP.NET MVC5 Entity Framework CodeFirst(代码优先)
- 一 Struts2 开发流程
- Logica实战与剖析(1)
- oracle星形转换,Oracle数据仓库博客(转,学)
- gravity、layout_gravity及orientation
- 2012 Java陷阱
- app vue 真机运行_使用 HBuilder 将 Vue 项目打包成手机 App
- jenkins即将重启问题
- Unity3D界面功能操作讲解【转http://www.cnblogs.com/fortomorrow/archive/2012/10/28/unity01.html】...
- .NET Framework(一)
- Android 四大组件学习之Service六
- 20200716每日一句
- Windows 10中无需禁用强制驱动签名检测加载驱动
- 世界各国Google域名后缀对照表
- 2022智源大会议程丨AI平台与系统专题论坛
- windows10 插入耳机无弹出,无声音,提示扬声器、耳机未插入
- 《2018秋招小结》
- 小小靖Java成长日记02
- c语言进阶编程 培训,大学C语言进阶编程实例.doc
热门文章
- 生化医学文章模式图素材
- 东北黑土区不同纬度农田土壤真菌分子生态网络的比较
- Annu. Rev. Genet:植物微生物组——系统性见解与展望
- R算数运算符:+、-、*、/、%%、%/%、^
- Logstic与Softmax比较
- asp连接mysql odbc,在ASP中连接MySQL数据库的方法,最好的通过ODBC方法
- 使用XML记录数据的一些体会
- day04 JDBC java数据库连接
- 用C语言编程 限定输入的年月日,C语言程序设计: 输入年月日 然后输出是星期几...
- java如何使实验箱蜂鸣器响_按键按一次蜂鸣器响一次的单片机程序