概述
在上一篇WebSecurityConfigurerAdapter源码分析中我们知道了HttpSecurity是如何被添加到WebSecurity中的,并且也知道HttpSecurity是用来构建securityFilterChain的,在实际项目配置中我们也一直在配置HttpSecurity,接下来我们就探索一下它是如何构建securityFilterChain。
HttpSecurity
先来看一下它的类图

从上面的类图我们可以看出HttpSecurity其实也是一个SecurityBuilder,只不过它构建的对象是DefaultSecurityFilterChain而已,由于HttpSecurity的源码比较多,下面只罗列一些比较重要的代码
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| public final class HttpSecurity extends AbstractConfiguredSecurityBuilder<DefaultSecurityFilterChain, HttpSecurity> implements SecurityBuilder<DefaultSecurityFilterChain>, HttpSecurityBuilder<HttpSecurity> { private final RequestMatcherConfigurer requestMatcherConfigurer; private List<Filter> filters = new ArrayList<>(); private RequestMatcher requestMatcher = AnyRequestMatcher.INSTANCE; private FilterComparator comparator = new FilterComparator();
@SuppressWarnings("unchecked") public HttpSecurity(ObjectPostProcessor<Object> objectPostProcessor, AuthenticationManagerBuilder authenticationBuilder, Map<Class<? extends Object>, Object> sharedObjects) { super(objectPostProcessor); Assert.notNull(authenticationBuilder, "authenticationBuilder cannot be null"); setSharedObject(AuthenticationManagerBuilder.class, authenticationBuilder); for (Map.Entry<Class<? extends Object>, Object> entry : sharedObjects .entrySet()) { setSharedObject((Class<Object>) entry.getKey(), entry.getValue()); } ApplicationContext context = (ApplicationContext) sharedObjects .get(ApplicationContext.class); this.requestMatcherConfigurer = new RequestMatcherConfigurer(context); } public ExpressionUrlAuthorizationConfigurer<HttpSecurity>.ExpressionInterceptUrlRegistry authorizeRequests() throws Exception { ApplicationContext context = getContext(); return getOrApply(new ExpressionUrlAuthorizationConfigurer<>(context)) .getRegistry(); } @Override protected DefaultSecurityFilterChain performBuild() throws Exception { Collections.sort(filters, comparator); return new DefaultSecurityFilterChain(requestMatcher, filters); } @SuppressWarnings("unchecked") private <C extends SecurityConfigurerAdapter<DefaultSecurityFilterChain, HttpSecurity>> C getOrApply( C configurer) throws Exception { C existingConfig = (C) getConfigurer(configurer.getClass()); if (existingConfig != null) { return existingConfig; } return apply(configurer); } }
|
总结
- HttpSecurity是一个SecurityBuilder,它最终的目的是构建SecurityFilterChain
- HttpSecurity提供了很多快捷的方法创建不同的SecurityConfigurer
- HttpSecurity执行doBuild方法的时候通过配置的SecurityConfigurer添加一些必要的Filter,最后在执行performBuild方法将这些Filter构造成一个SecurityFilterChain