spring security源码分析(一)
前言
最近看一个开源平台的时候,使用到了spring security 和 oauth2 项目中覆盖了很多oauth2 框架类导致不明所以,所以学习了spring security 源码。借此文章记录学习的过程。
spring security 框架设计
- SecurityBuilder 和 SecurityConfigurer 为spring security的顶级接口设计。SecurityBuilder 是对构建的抽象。SecurityConfigurer 是对配置的一个抽象。
- AbstractSecurityBuilder 、 AbstractConfiguredSecurityBuilder 是对 SecurityBuilder 的实现
- 顶层接口的设计实现配置与构建分离。配置只需要关注配置的实现,构建只需要把所有的配置构建成目标对象。
- 框架的目标是构建出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 调用 AutowiredWebSecurityConfigurersIgnoreParents 类的 getWebSecurityConfigurers 方法通过 ConfigurableListableBeanFactory 获取所有实现 WebSecurityConfigurer 接口的类。也就是我们常使用到的 WebSecurityConfigurerAdapter 类
- @2 对 WebSecurity 进行实例化操作,后面会详细介绍 WebSecurity 。实例化的具体实现方式为bean工厂对 WebSecurity bean 进行初始化
- @3 调用 WebSecurity 的父类 AbstractConfiguredSecurityBuilder 的apply 方法,把所有配置类加入到父类 AbstractConfiguredSecurityBuilder 的成员变量中。后续对配置进行build操作的时候会使用到