Loading

spring security源码分析(一)

前言

最近看一个开源平台的时候,使用到了spring securityoauth2 项目中覆盖了很多oauth2 框架类导致不明所以,所以学习了spring security 源码。借此文章记录学习的过程。

spring security 框架设计

img

  1. SecurityBuilder 和 SecurityConfigurer 为spring security的顶级接口设计。SecurityBuilder 是对构建的抽象。SecurityConfigurer 是对配置的一个抽象。
  2. AbstractSecurityBuilder 、 AbstractConfiguredSecurityBuilder 是对 SecurityBuilder 的实现
  3. 顶层接口的设计实现配置与构建分离。配置只需要关注配置的实现,构建只需要把所有的配置构建成目标对象。
  4. 框架的目标是构建出Filter过滤器让容器去加载,该过滤器为 FilterChainProxy 过滤器链

源码分析

1、 EnableWebSecurity

@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ WebSecurityConfiguration.class, ## spring security配置的入口类
		SpringWebMvcImportSelector.class,
		OAuth2ImportSelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
	boolean debug() default false;
}

2、 WebSecurityConfiguration

主要关注 setFilterChainProxySecurityConfigurer 和 springSecurityFilterChain 两个方法

  • 下面是setFilterChainProxySecurityConfigurer方法的分析
@Autowired(required = false)
	public void setFilterChainProxySecurityConfigurer(
			ObjectPostProcessor<Object> objectPostProcessor,
			@Value("#{@autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()}") List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers @1
            )
			throws Exception {
		webSecurity = objectPostProcessor
				.postProcess(new WebSecurity(objectPostProcessor)); @2

        ...中间省略...

		for (SecurityConfigurer<Filter, WebSecurity> webSecurityConfigurer : webSecurityConfigurers) {
			webSecurity.apply(webSecurityConfigurer); @3
		}
		this.webSecurityConfigurers = webSecurityConfigurers;
	}
  1. @1 调用 AutowiredWebSecurityConfigurersIgnoreParents 类的 getWebSecurityConfigurers 方法通过 ConfigurableListableBeanFactory 获取所有实现 WebSecurityConfigurer 接口的类。也就是我们常使用到的 WebSecurityConfigurerAdapter 类
  2. @2 对 WebSecurity 进行实例化操作,后面会详细介绍 WebSecurity 。实例化的具体实现方式为bean工厂对 WebSecurity bean 进行初始化
  3. @3 调用 WebSecurity 的父类 AbstractConfiguredSecurityBuilder 的apply 方法,把所有配置类加入到父类 AbstractConfiguredSecurityBuilder 的成员变量中。后续对配置进行build操作的时候会使用到
posted @ 2022-05-08 17:44  红尘皆过客  阅读(551)  评论(0)    收藏  举报