Spring Security:(八)WebSecurity与HttpSecurity初始化
调用 WebSecurity 的 build() 方法返回一个 FilterChainProxy 实例。
调用 HttpSecurity 的 build() 方法返回一个 SecurityFilterChain 实例(DefaultSecurityFilterChain 是 SecurityFilterChain 的唯一实现类)。
WebSecurity 和 HttpSecurity 是如何初始化的?
需要重新从 FilterChainProxy 初始化过程开始看,参考前面文章 启动时初始化FilterChainProxy 。
WebSecurity 初始化
在执行 WebSecurityConfiguration 的 setFilterChainProxySecurityConfigurer(...) 方法时,通过 new 关键字实例化了 WebSecurity。
至此 WebSecurity 就初始化完成了。
HttpSecurity 初始化
步骤一
从 WebSecurityConfiguration 的 setFilterChainProxySecurityConfigurer(...) 方法开始执行。
这次重点看上图的三处位置:
1. 上图标①位置是一个 @Value 注解,里面是 Spring SpEL 表达式,其作用是调用 AutowiredWebSecurityConfigurersIgnoreParents 的 getWebSecurityConfigurers() 方法,并将返回赋值给上图中标②位置的 webSecurityConfigurers
2. 上图标②位置的 webSecurityConfigurers 已经被赋值了。查看 AutowiredWebSecurityConfigurersIgnoreParents 的 getWebSecurityConfigurers() 方法体,其返回值是所有 WebSecurityConfigurer 实例的 List 集合。
3. 上图标③位置,是调用 WebSecurity 的 apply(...) 方法,其作用是将 webSecurityConfigurers 中的元素添加到 WebSecurity 的属性 configurers 中(见下图 AbstractConfiguredSecurityBuilder 是 WebSecurity 父类)。
到此总结一下:在 WebSecurity 的 configurers 属性中保存了所有的 WebSecurityConfigurer 实例
步骤二
继续往下梳理,接着执行 WebSecurityConfiguration 的 springSecurityFilterChain() 方法:
会调用 WebSecurity 的 build() 方法,webSecurity 的 build() 方法梳理参考前面的文章 通过WebSecurity构建FilterChainProxy 。
在 WebSecurity 的 build() 方法执行过程中,会走到 dobuild() 方法体中,这次重点关注其中的 init() 这一步:
查看 init() 的方法体:
在 init() 方法体中先调用了 getConfigurers() 方法,获取一个集合,遍历并调用集合中元素的 init(...) 方法。查看 getConfigurers() 方法体可以看到是从 WebSecurity 的属性 configurers 中获取元素。在前面步骤一中已经知道了 configurers 就是 WebSecurityConfigurer 实例的集合。
因而下一步,就是查看 WebSecurityConfigurer 的 init(...) 方法。
到此总结一下:获取 WebSecurity 的属性 configurers,并遍历其中的 WebSecurityConfigurer 实例,调用 WebSecurityConfigurer 的 init(...) 方法。
步骤三
因 WebSecurityConfigurerAdapter 是 WebSecurityConfigurer 的实现类,因而到 WebSecurityConfigurerAdapter 中查看 init(..) 方法体:
通过调用 getHttp() 方法获取了 HttpSecurity 的实例,进入到 getHttp() 方法中查看:
通过 new 关键字实例化了 HttpSecurity。
至此 HttpSecurity 初始化就完成了。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!