Spring Security @EnableWebSecurity 注解原理分析

1.@EnableWebSecurity
2.@Import(WebSecurityConfiguration)
3.WebSecurityConfiguration是一个配置类@Configuration
4.进入@AutoWired方法:从容器中获取ObjectBeanProcessor和WebSecurityConfigurer的实现类(一般都是去继承WebSecurityConfigurerAdapter)
5.根据ObjectBeanProcessor创建WebSecurity
6.将容器中的WebSecurityConfigurer遍历apply,即添加到WebSecurity中
7.进入@Bean标注方法:创建一个BeanName为SpringSecurityFilterChain的Filter实现类FilterChainProxy(继承GenericFilterBean)
===FilterChainProxy==处理逻辑
FilterChainProxy中有一个属性是List<SecurityFilterChain> filterChains,里面存储了多个DefaultSecurityFilterChain实例
FilterChainProxy的doFilter方法会遍历filterChains集合,使用SecurityFilterChain接口的RequestMatcher匹配器进行匹配
匹配到了会创建一个FilterChainProxy的内部类VirtualFilterChain,然后调用虚拟过滤器链的doFilter方法
执行完VirtualFilterChain中的Filters后执行原来的过滤器链
===FilterChainProxy==处理逻辑
8.执行WebSecurity的build方法,该方法是一个模板方法定义在AbstractSecurityBuilder中
9.进入AbstractSecurityBuilder的build方法,有一个cas实现多线程安全,执行模板方法doBuild方法
10.进入AbstractConfiguredSecurityBuilder的doBuild方法,执行init方法,执行configure方法执行performBuild返回Filter
11.进入AbstractConfiguredSecurityBuilder的init方法进行遍历WebSecurityConfigurer实现类的init(webSecurity)方法
12.进入WebSecurityConfigurer实现类的init(WebSecurity)方法,执行getHttp()获取HttpSecurity对象
13.执行addSecurityFilterChainBuilder方法将HttpSecurity对象设置进去,添加FilterSecurityInterceptor
14.getHttp()方法中创建了HttpSecurity对象,配置一些配置器(这些配置器是用来生成SecurityFilterChain中的Filter的)
15.getHttp()方法中执行WebSecurityConfigurerAdapter的configure(HttpSecurity),(使用者自定义扩展点)
16.进入AbstractConfiguredSecurityBuilder的configure方法遍历WebSecurityConfigurer实现类的configure(webSecurity)方法(使用者自定义扩展点)
17.进入AbstractConfiguredSecurityBuilder的performBuild方法,获取IgnoreRquest和SecurityFilterChainBuilder的个数总和
18.根据个数总和作为集合容量大小创建SecurityFilterChain集合
19.遍历每个ignoreRquest创建DefaultSecurityFilterChain,RequestMatcher都是AntPathRequestMatcher
20.遍历每个SecurityFilterChainBuilder(即HttpSecurity实例)的build方法
21.根据SecurityFilterChain集合创建FilterChainProxy实例,调用FilterChainProxy的初始化方法

发布了53 篇原创文章 · 获赞 10 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/blog_zxb/article/details/101623377
今日推荐