本文关注应用的安全方面,涉及校验以及授权方面,以springboot自带的security板块作为讲解的内容
实例
建议用户可直接路由至博主的先前博客spring security整合cas方案。本文则针对相关的源码作下简单的分析,方便笔者以及读者更深入的了解spring的security板块
@EnableWebSecurity
这个注解很精髓,基本上可以作为security的入口,笔者贴一下它的源码
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import({ WebSecurityConfiguration.class,
SpringWebMvcImportSelector.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;
}
可以分为三个部分来分析,
SpringWebMvcImportSelector-支持mvc的参数安全校验,替代了@EnableWebMvcSecurity注解
WebSecurityConfiguration-Web的安全配置
@EnableGlobalAuthentication-支持公共的认证校验
SpringWebMvcImportSelector
首先先看下其如何整合mvc的安全校验,其是一个ImportSelector接口,观察下其复写的方法
public String[] selectImports(AnnotationMetadata importingClassMetadata) {
boolean webmvcPresent = ClassUtils.isPresent(
"org.springframework.web.servlet.DispatcherServlet",
getClass().getClassLoader());
return webmvcPresent
? new String[] {
"org.springframework.security.config.annotation.web.configuration.WebMvcSecurityConfiguration" }
: new String[] {};
}
由上述代码可知,在classpath环境中存在mvc的关键类DispatcherServlet时便会引入WebMvcSecurityConfiguration类,那么此类又配置了什么东西呢?
里面的代码很简单,但关键是其是WebMvcConfigurer接口的实现类,根据之前的文章提到,该接口主要是用于配置MVC的相关功能,比如参数处理器、返回值处理器、异常处理器等等。
而该类只是扩展了相应的参数处理器,我们可以看下源码
@Override
@SuppressWarnings("deprecation")
public void addArgumentResolvers(List argumentResolvers) {
// 支持@AuthenticationPrinciple参数注解校验
AuthenticationPrincipalArgumentResolver authenticationPrincipalResolver = new AuthenticationPrincipalArgumentResolver();
authenticationPrincipalResolver.setBeanResolver(beanResolver);
argumentResolvers.add(authenticationPrincipalResolver);
// 废弃
argumentResolvers
.add(new org.springframework.security.web.bind.support.AuthenticationPrincipalArgumentResolver());
// csrf token参数
argumentResolvers.add(new CsrfTokenArgumentResolver());
}
针对@AuthenticationPrinciple注解的参数校验,本文不展开了,这里作下归纳
带有@AuthenticationPrinciple注解的参数其值会从SecurityContext的上下文读取相应的Authentication校验信息
有一个要求,被该注解修饰的参数须同SecurityContext的上下文存放的Authentication信息为同一接口,否则则会返回null。如果设置了errorOnInvalidType属性为true,则会抛异常
综上所述,该注解主要是方便将校验通过的Token用于参数赋值,其它的作用也不是很大
@EnableGlobalAuthentication
再来分析下springboot-security的公共认证校验是什么概念,贴下源码
@Retention(value = java.lang.annotation.RetentionPolicy.RUNTIME)
@Target(value = { java.lang.annotation.ElementType.TYPE })
@Documented
@Import(AuthenticationConfiguration.class)
@Configuration
public @interface EnableGlobalAuthentication {
}
OK,直接进入相应的AuthenticationConfiguration类进行具体的分析
1.其引入了ObjectPostProcessorConfiguration配置用于创建AutowireBeanFactoryObjectPostProcessor类,作用应该是通过Spring上下文实例相应的实体类并注册到bean工厂中
@Bean
public ObjectPostProcessor