springboot中security源码分析
2022-01-12 17:38:46 19 举报
AI智能生成
springboot中security源码分析
作者其他创作
大纲/内容
1. 添加springSecurityFilterChain到spring上下文(初始化前)
1.1 加载SpringBootWebSecurityConfiguration配置类(在没有自定义WebSecurityConfigurerAdapter bean时才会引入)
1.2 在1.1中会引入WebSecurityConfigurerAdapter 类型的bean,会满足WebSecurityEnablerConfiguration配置类的加载条件
1.3 通过1.2会引入@EnableWebSecurity注解,所以项目使用spring security时不手动添加该注解也会自动引入
1.4 @EnableWebSecurity注解通过@import引入WebSecurityConfiguration类,从而引入springSecurityFilterChain Bean
2. 注册过滤器代理DelegatingFilterProxy到servlet容器
2.1 加载SecurityFilterAutoConfiguration配置类(满足@ConditionalOnClass条件)
2.2 执行配置类中DelegatingFilterProxyRegistrationBean(“springSecurityFilterChain”)初始化(1#1.4中会满足该bean加载条件)
2.3 DelegatingFilterProxyRegistrationBean类中重写了父类getFilter()方法返回一个DelegatingFilterProxy对象
2.4 容器初始化时会执行ServletContextInitializer#onstart()方法,最终会往servlet中添加DelegatingFilterProxy过滤器
该过滤器的加载时机为springboot内嵌初始化#2.7.9.2.2.5
2.5 之后所有的请求都会通过DelegatingFilterProxy过滤器代理到FilterChainProxy过滤器(即"springSecurityFilterChain" Bean)
3. 收集WebSecurityConfigurer配置到webSecurity对象
3.1 WebSecurityConfiguration类初始化执行带@Autowired的springSecurityFilterChain方法
3.2 调用AutowiredWebSecurityConfigurersIgnoreParents#getWebSecurityConfigurers()方法获取配置
3.3 将上一步获取的配置循环put到webSecurity的LinkedHashMap configurers属性中(属性来自父类AbstractConfiguredSecurityBuilder)
4. webSecurity.build()构建springSecurityFilterChain过滤器bean
4.1 beforeInit() //供子类覆盖的模板方法
4.2 init() //循环执行3#3.3#configurers中所有配置的init(WebSecurity w)方法
4.2.1 WebSecurityConfigurerAdapter#getHttp()生成HttpSecurity http对象
1. 生成父authenticationManager对象,如有重写configure(AuthenticationManagerBuilder auth)方法则返回null,否重通过getAuthenticationManager()方法生产AuthenticationManager对象,会从spring上下文中获取UserDetailsService
1.1 @EnableWebSecurity中引入AuthenticationConfiguration配置bean
1.2 WebSecurityConfigurerAdapter类中引入上一步的authenticationConfiguration
1.3 通过authenticationConfiguration.getAuthenticationManager()生成对象
1. 通过authenticationManagerBuilder方法获取AuthenticationManagerBuilder对象authBuilder
2. 将所有GlobalAuthenticationConfigurerAdapter配置添加到authBuilder对象的configurers属性(类似3#3.3)
EnableGlobalAuthenticationAutowiredConfigurer
InitializeUserDetailsBeanManagerConfigurer
如果spring上下文中存在UserDetailsService bean,则会通过该bean构建一个DaoAuthenticationProvider添加到authBuilder中
InitializeAuthenticationProviderBeanManagerConfigurer
如果spring上下文中存在AuthenticationProvider,则会添加到authBuilder中
3. 执行authBuilder.build()生成AuthenticationManager对象返回,同时authBuilder对象中也会存储生成的对象
3.1 init()
3.2 configure()
3.3performBuild() //创建一个ProviderManager对象返回
2. 设置authenticationBuilder的parentAuthenticationManager为上一步返回值(4.5.3#3中会将该值作为父authenticationManager,在对用户身份验证时如果当前provider中没有符合条件的会从父authenticationManager的provider去验证),如果上一步返回null则需自己为authenticationManager设置UserDetailsService等值配置。可参考oauth的AuthorizationServerSecurityConfigurer#init方法
3. 创建sharedObjects对象
4. 实例化一个HttpSecurity对象http,会将authenticationBuilder添加到sharedObjects中,然后将sharedObjects设置到http对象中
5. 为上一步的http对象设值,主要是添加默认的过滤器Configurer
6. 调用configure(HttpSecurity h)方法,WebSecurityConfigurerAdapter子类可重写对HttpSecurity对象进行自定义设置或添加新的SecurityConfigurerAdapter配置,在4.5.3 http.build()时会执行配置
4.2.2 将上一步生成的http放入到webSecurity对象的List securityFilterChainBuilders 属性中(在4.5 performBuild()方法中会执行http.build())
4.2.3 设置springSecurityFilterChain构建完成回调操作(4.5.6中会调用)
4.3 beforeConfigure() //供子类覆盖的模板方法
4.4 configure() //循环执行3#3.3#configurers中所有配置的configure(WebSecurity w)方法
4.5 performBuild()
4.5.1 实例一个List securityFilterChains ,列表大小为ignoredRequests大小+4.2.2中securityFilterChainBuilders的大小
4.5.2 循环ignoredRequests列表,通过列表中的RequestMatcher对象构建DefaultSecurityFilterChain添加到securityFilterChains列表中
4.5.3 循环4.2.2 中securityFilterChainBuilders列表,通过列表元素的build()方法生成DefaultSecurityFilterChain对象添加到securityFilterChains列表中
http.build()
1. 在4.2.1#5中往http对象中添加了许多过滤器配置,这些配置继承自SecurityConfigurerAdapter
2. init() //循环调用过滤器配置的init方法对配置进行初始化
如果此时在此方法中通过HttpSecurity#getOrApply方法添加过滤器Configurer则会被添加到configurersAddedInInitializing中
3. beforeConfigure,通过sharedObject对象中的AuthenticationManagerBuilder对象进行build生成authenticationManager并设置到sharedObject中
4. configure() //循环调用过滤器配置的configure方法往http对象的filters属性添加过滤器配置对应的Filter
1. WebAsyncManagerIntegrationFilter
3. HeaderWriterFilter
2. SecurityContextPersistenceFilter
4. CsrfFilter
5. LogoutFilter
6. RequestCacheAwareFilter
7. SecurityContextHolderAwareRequestFilter
8. AnonymousAuthenticationFilter
9. SessionManagementFilter
10. ExceptionTranslationFilter
11. FilterSecurityInterceptor
5. performBuild() //对filters进行排序后生成DefaultSecurityFilterChain对象添加到securityFilterChains列表中
4.5.4 通过securityFilterChains构建FilterChainProxy filterChainProxy对象
4.5.5 判断Spring上下文中是否有注入HttpFirewall bean,有则设置到filterChainProxy对象中覆盖默认的new StrictHttpFirewall()对象
4.5.6 执行回调postBuildAction.run(),4.2.3中有设置回调内容
5. springSecurityFilterChain过滤器bean处理请求
1. 请求通过DelegatingFilterProxy委托到FilterChainProxy进入doFilter方法
2. doFilter中会调用FilterChainProxy#doFilterInternal方法
1. 进行防火墙规则校验默认是使用StrictHttpFirewall(4.5.5中可配置),不通过会抛出RequestRejectedException
1. 校验方法是否被允许
2. 校验URL 是否是标准化的URL
3. 校验是否包含不可打印ASCII字符
2. 循环securityFilterChains列表获取匹配的SecurityFilterChain然后返回SecurityFilterChain#filters
3. 通过上一步获取的filters构建VirtualFilterChain对象,调用VirtualFilterChain#doFilter执行filters中的过滤器逻辑
springsecurity授权分析
security oauth源码分析
0 条评论
下一页