Spring Security介绍(二) 主要组件(1) SecurityConfigurer

发布于:2024-04-28 ⋅ 阅读:(21) ⋅ 点赞:(0)

一、介绍

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 {
    }
}


网站公告

今日签到

点亮在社区的每一天
去签到