security-oauth2(FilterChainProxy过滤器链代理的加载过程)

本文详细解析了Spring Boot Security OAuth2中FilterChainProxy的加载过程,从setFilterChainProxySecurityConfigurer方法开始,到springSecurityFilterChain方法结束,深入探讨了过滤器链的初始化和构建,包括过滤器的添加、配置和初始化,以及在HttpSecurity对象中的应用。通过这个过程,理解了OAuth2中过滤器如何参与到token的解析中。
摘要由CSDN通过智能技术生成

token的解析,是靠过滤器链中的过滤器来实现的,本章内容主要讲述了过滤器的加载过程

WebSecurityConfiguration配置类(源码核心配置类)

1 setFilterChainProxySecurityConfigurer()方法

@Configuration
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
   

	@Autowired(required = false)
	public void setFilterChainProxySecurityConfigurer(
			ObjectPostProcessor<Object> objectPostProcessor,
			@Value("#{@autowiredWebSecurityConfigurersIgnoreParents.getWebSecurityConfigurers()}") List<SecurityConfigurer<Filter, WebSecurity>> webSecurityConfigurers)
			throws Exception {
   
		webSecurity = objectPostProcessor
				.postProcess(new WebSecurity(objectPostProcessor));
		if (debugEnabled != null) {
   
			webSecurity.debug(debugEnabled);
		}

		Collections.sort(webSecurityConfigurers, AnnotationAwareOrderComparator.INSTANCE);

		Integer previousOrder = null;
		Object previousConfig = null;
		for (SecurityConfigurer<Filter, WebSecurity> config : webSecurityConfigurers) {
   
			Integer order = AnnotationAwareOrderComparator.lookupOrder(config);
			if (previousOrder != null && previousOrder.equals(order)) {
   
				throw new IllegalStateException(
						"@Order on WebSecurityConfigurers must be unique. Order of "
								+ order + " was already used on " + previousConfig + ", so it cannot be used on "
								+ config + " too.");
			}
			previousOrder = order;
			previousConfig = config;
		}
		for (SecurityConfigurer<Filter, WebSecurity> webSecurityConfigurer : webSecurityConfigurers) {
   
			webSecurity.apply(webSecurityConfigurer);
		}
		this.webSecurityConfigurers = webSecurityConfigurers;
	}
}

上面代码块,setFilterChainProxySecurityConfigurer 方法有两个参数,其中第二个参数 webSecurityConfigurers是通过 autowiredWebSecurityConfigurersIgnoreParents().getWebSecurityConfigurers() 方法获取所有WebSecurityConfigurer类的子类如下图
在这里插入图片描述
截图中可以获取到了三个子类,其中第一个子类WebSecurityConfig是在security-oauth配置包中自定义的,另外两个是源码自带的,

在获取到三个子类后,接着实现了 webSecurity 对象 ,然后对三个子类进行排序,再然后调用webSecurity.apply(webSecurityConfigurer) 方法,将三个子类初始化到WebSecurity 的父类 AbstractConfiguredSecurityBuilder 类中的 configurers 属性中去

在 setFilterChainProxySecurityConfigurer 方法的最后,将获取到的三个子类初始化到当前WebSecurityConfiguration类的webSecurityConfigurers属性中去

2. springSecurityFilterChain()方法

@Configuration
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
   

	@Bean(name = AbstractSecurityWebApplicationInitializer.DEFAULT_FILTER_NAME)
	public Filter springSecurityFilterChain() throws Exception {
   
		boolean hasConfigurers = webSecurityConfigurers != null
				&& !webSecurityConfigurers.isEmpty();
		if (!hasConfigurers) {
   
			WebSecurityConfigurerAdapter adapter = objectObjectPostProcessor
					.postProcess(new WebSecurityConfigurerAdapter() {
   
					});
			webSecurity.apply(adapter);
		}
		return webSecurity.build();
	}
	
}

因为在前文的setFilterChainProxySecurityConfigurer() 方法中,已经初始化了webSecurityConfigurers ,所以上面代码块中直接走的最后一行代码 webSecurity.build() 方法,进入该方法

public abstract 
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值