怎样进行SpringSecurity初始化流程梳理
怎样进行Spring Security初始化流程梳理,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
成都创新互联公司公司2013年成立,先为贡山等服务建站,贡山等地企业,进行企业商务咨询服务。为贡山企业网站制作PC+手机+微官网三网同步一站式服务解决您的所有建站问题。
今天试着来和大家捋一遍 Spring Security 的初始化流程。
在 Spring Boot 中,Spring Security 的初始化,我们就从自动化配置开始分析吧!
1.SecurityAutoConfiguration
Spring Security 的自动化配置类是 SecurityAutoConfiguration,我们就从这个配置类开始分析。
@Configuration(proxyBeanMethods = false)
@ConditionalOnClass(DefaultAuthenticationEventPublisher.class)
@EnableConfigurationProperties(SecurityProperties.class)
@Import({ SpringBootWebSecurityConfiguration.class, WebSecurityEnablerConfiguration.class,
SecurityDataConfiguration.class })
public class SecurityAutoConfiguration {
@Bean
@ConditionalOnMissingBean(AuthenticationEventPublisher.class)
public DefaultAuthenticationEventPublisher authenticationEventPublisher(ApplicationEventPublisher publisher) {
return new DefaultAuthenticationEventPublisher(publisher);
}
}
这个 Bean 中,定义了一个事件发布器。另外导入了三个配置:
SpringBootWebSecurityConfiguration:这个配置的作用是在如果开发者没有自定义 WebSecurityConfigurerAdapter 的话,这里提供一个默认的实现。 WebSecurityEnablerConfiguration:这个配置是 Spring Security 的核心配置,也将是我们分析的重点。 SecurityDataConfiguration:提供了 Spring Security 整合 Spring Data 的支持,由于国内使用 MyBatis 较多,所以这个配置发光发热的场景有限。
2.WebSecurityEnablerConfiguration
接着来看上面出现的 WebSecurityEnablerConfiguration:
@Configuration(proxyBeanMethods = false)
@ConditionalOnBean(WebSecurityConfigurerAdapter.class)
@ConditionalOnMissingBean(name = BeanIds.SPRING_SECURITY_FILTER_CHAIN)
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.SERVLET)
@EnableWebSecurity
public class WebSecurityEnablerConfiguration {
}
这个配置倒没啥可说的,给了一堆生效条件,最终给出了一个 @EnableWebSecurity 注解,看来初始化重任落在 @EnableWebSecurity 注解身上了。
3.@EnableWebSecurity
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ WebSecurityConfiguration.class,
SpringWebMvcImportSelector.class,
OAuth3ImportSelector.class })
@EnableGlobalAuthentication
@Configuration
public @interface EnableWebSecurity {
/**
* Controls debugging support for Spring Security. Default is false.
* @return if true, enables debug support with Spring Security
*/
boolean debug() default false;
}
@EnableWebSecurity 所做的事情,有两件比较重要:
导入 WebSecurityConfiguration 配置。 通过 @EnableGlobalAuthentication 注解引入全局配置。
3.1 WebSecurityConfiguration
WebSecurityConfiguration 类实现了两个接口,我们来分别看下:
public class WebSecurityConfiguration implements ImportAware, BeanClassLoaderAware {
}
ImportAware 接口和 @Import 注解一起使用的。实现了 ImportAware 接口的配置类可以方便的通过 setImportMetadata 方法获取到导入类中的数据配置。
可能有点绕,我再梳理下,就是 WebSecurityConfiguration 实现了 ImportAware 接口,使用 @Import 注解在 @EnableWebSecurity 上导入 WebSecurityConfiguration 之后,在 WebSecurityConfiguration 的 setImportMetadata 方法中可以方便的获取到 @EnableWebSecurity 中的属性值,这里主要是 debug 属性。
我们来看下 WebSecurityConfiguration#setImportMetadata 方法:
public void setImportMetadata(AnnotationMetadata importMetadata) {
Map enableWebSecurityAttrMap = importMetadata
.getAnnotationAttributes(EnableWebSecurity.class.getName());
AnnotationAttributes enableWebSecurityAttrs = AnnotationAttributes
.fromMap(enableWebSecurityAttrMap);
debugEnabled = enableWebSecurityAttrs.getBoolean("debug");
if (webSecurity != null) {
webSecurity.debug(debugEnabled);
}
}
获取到 debug 属性赋值给 WebSecurity。
实现 BeanClassLoaderAware 接口则是为了方便的获取 ClassLoader。
这是 WebSecurityConfiguration 实现的两个接口。
在 WebSecurityConfiguration 内部定义的 Bean 中,最为重要的是两个方法:
springSecurityFilterChain 该方法目的是为了获取过滤器链。 setFilterChainProxySecurityConfigurer 这个方法是为了收集配置类并创建 WebSecurity。
这两个方法是核心,我们来逐一分析,先来看 setFilterChainProxySecurityConfigurer:
@Autowired(required = false)
public void setFilterChainProxySecurityConfigurer(
ObjectPostProcessor