11.5.1 配置响应式 Web 安全

重提一下,配置 Spring Security 以确保 Spring MVC 的 web 应用程序的安全,通常涉及创建一个扩展 WebSecurityConfigurerAdapter 的新配置类,并添加 @EnableWebSecurity 注解。这样的配置类通过覆写 configuration() 方法,以指定 web 安全性规范,例如:哪些请求路径需要什么样的授权。以下简单的配置类,让您重温一下非响应式 Spring MVC 应用程序,是如何配置 Spring Security 的:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
         .authorizeRequests()
          .antMatchers("/design", "/orders").hasAuthority("USER")
           .antMatchers("/**").permitAll();
    }
}

现在,让我们看看对于响应式 Spring WebFlux 应用,同样的配置是什么样子。下面的清单显示了一个响应式安全配置类,这大致相当于上面的简单配置类。

程序清单 11.2 为 Spring WebFlux 应用配置 Spring Security
@Configuration
@EnableWebFluxSecurity
public class SecurityConfig {
    @Bean
    public SecurityWebFilterChain securityWebFilterChain(
                                             ServerHttpSecurity http) {
        return http
            .authorizeExchange()
              .pathMatchers("/design", "/orders").hasAuthority("USER")
              .anyExchange().permitAll()
          .and()
            .build();
    }
}

正如你所见,有很多是熟悉的,但同时又有些不同。比如这个新的配置类没有使用 @EnableWebSecurity ,而是使用了 @EnableWebFluxSecurity 。此外,也没有继承像 WebSecurityConfigurerAdapter 的任何其他基类。因此,它也不用覆写任何 configure() 方法。

代替 configure() 方法,您可以使用 securityWebFilterChain() 方法声明 SecurityWebFilterChain 类型的 bean。而 securityWebFilterChain() 的方法体与前面配置的 configure() 方法没有太大区别,只有一些微小的变化。

首先,使用给定的 ServerHttpSecurity 对象进行配置,而不是 HttpSecurity 对象。使用 ServerHttpSecurity 声明请求级别安全性,可以调用 authorizeExchange(),这大致相当于 authorizeRequests()

注意:ServerHttpSecuritySpring Security 5 的中新加的功能,是 HttpSecurity 的一种响应式编程的模拟。

在匹配路径时,仍然可以使用 Ant 样式的通配符路径,但要使用 pathMatchers() 方法而不是 antMatchers()。为了方便起见,您不再需要指定 /** 来匹配所有路径,因为 anyExchange() 会捕获所有路径。

最后,因为您将 SecurityWebFilterChain 声明为 bean ,且没有覆写任何框架方法,所以必须调用 build() 方法,来组装所有安全规则以返回给 SecurityWebFilterChain

除了这些小的区别,对于 Spring WebFluxSpring MVC 的 web 安全配置基本一致。但如何指定有关用户的安全配置呢?

最后更新于