一、介绍
1、介绍
SecurityConfigurer 在 Spring Security 中是一个非常重要的角色。在前面的内容中曾经多次提到过,Spring Security 过滤器链中的每一个过滤器,都是通过 xxxConfigurer 来进行配置的,而这些
xxxConfigurer 实际上都是 SecurityConfigurer 的实现。
// O(DefaultSecurityFilterChain) B(HttpSecurity)
public interface SecurityConfigurer<O, B extends SecurityBuilder<O>> {
/**
* Initialize the {@link SecurityBuilder}. Here only shared state should be created
* and modified, but not properties on the {@link SecurityBuilder} used for building
* the object. This ensures that the {@link #configure(SecurityBuilder)} method uses
* the correct shared objects when building. Configurers should be applied here.
* @param builder
* @throws Exception
*/
void init(B builder) throws Exception;
/**
* Configure the {@link SecurityBuilder} by setting the necessary properties on the
* {@link SecurityBuilder}.
* @param builder
* @throws Exception
*/
void configure(B builder) throws Exception;
}
在init方法和configure方法中的形参都是SecurityBuilder类型,而SecurityBuilder是用来构建过滤器链的【DefaultSecurityFilterChainProxy】
2、实现
SecurityConfigurer的实现很多
主要实现有三个
(1) SecurityConfigurerAdapter
(2)GlobalAuthenticationConfigurerAdapter
(2)WebSecurityConfigurer
二、SecurityConfigurerAdapter
public abstract class SecurityConfigurerAdapter<O, B extends SecurityBuilder<O>> implements SecurityConfigurer<O, B>
三、WebSecurityConfigurer
public interface WebSecurityConfigurer<T extends SecurityBuilder<Filter>> extends SecurityConfigurer<Filter, T> {
}
主要实现是WebSecurityConfigurerAdapter
public abstract class WebSecurityConfigurerAdapter implements WebSecurityConfigurer<WebSecurity>
下面看下WebSecurityConfigurerAdapter:
1、使用
自定义一个类如WebSecurityConfig 继承WebSecurityConfigurerAdapter抽象类,WebSecurityConfig 类上加上 @EnableWebSecurity 注解后,便会自动被 Spring 发现并注册(点击 @EnableWebSecurity 注解可以看到 @Configuration 注解已经存在,所以此处不需要额外添加)。
2、主要方法
2.1、configure(HttpSecurity http)配置访问控制
protected void configure(HttpSecurity http) throws Exception {
this.logger.debug("Using default configure(HttpSecurity). If subclassed this will potentially override subclass configure(HttpSecurity).");
((HttpSecurity)((HttpSecurity)((AuthorizedUrl)http.authorizeRequests().anyRequest()).authenticated().and()).formLogin().and()).httpBasic();
}
通过源码可以看到 WebSecurityConfigurerAdapter 已经默认声明了一些安全特性:
验证所有用户请求; 允许用户使用表单登录进行身份验证(Spring Security 提供了一个简单的表单登录页面); 允许用户使用 HTTP 基本认证。
通过覆写该方法,可以实现更多功能,如:
(1)跨域支持
先对SpringBoot配置,运行跨域请求
@Configuration
public class CorsConfig implements WebMvcConfigurer {
@Override
public void addCorsMappings(CorsRegistry registry) {
// 设置允许跨域的路径
registry.addMapping("/**")
// 设置允许跨域请求的域名
.allowedOriginPatterns("*")
// 是否允许cookie
.allowCredentials(true)
// 设置允许的请求方式
.allowedMethods("GET", "POST", "DELETE", "PUT")
// 设置允许的header属性
.allowedHeaders("*")
// 跨域允许时间
.maxAge(3600);
}
}
由于我们的资源都会收到SpringSecurity的保护,所以想要跨域访问还要让SpringSecurity运行跨域访问。
//允许跨域
http.cors();
(2)
2.2、configure(AuthenticationManagerBuilder auth)身份认证
指定使用哪个 UserDetailsService 实现来获取用户信息和密码,以及使用哪个 PasswordEncoder 实现进行密码校验。
2.3、configure(WebSecurity web)
可以设置白名单,不经过过滤器
@Override
public void configure(WebSecurity web) throws Exception {
web.ignoring().antMatchers(AUTH_WHITELIST);
}
四、GlobalAuthenticationConfigurerAdapter
1、介绍
GlobalAuthenticationConfigurerAdapter 看名字就知道是一个跟全局配置有关的东西,它本身实
现了 SecurityConfigurerAdapter 接口,但是并未对方法做具体的实现,只是将泛型具体化了。
可以看到,SecurityConfigurer 中的泛型,现在明确成了 AuthenticationManager 和
AuthenticationManagerBuilder。所以 GlobalAuthenticationConfigurerAdapter 的实现类将来主要
是和配置 AuthenticationManager 有关。当然也包括默认的用户名密码也是由它的实现类来进行配置的。我们在 Spring Security 中使用的 AuthenticationManager 其实可以分为两种,一种是局部的,另一种是全局的,这里主要是全局的配置。
public abstract class GlobalAuthenticationConfigurerAdapter implements SecurityConfigurer<AuthenticationManager, AuthenticationManagerBuilder> {
public GlobalAuthenticationConfigurerAdapter() {
}
public void init(AuthenticationManagerBuilder auth) throws Exception {
}
public void configure(AuthenticationManagerBuilder auth) throws Exception {
}
}