跳到主要内容

WebFlux 安全

DeepSeek V3 中英对照 WebFlux Security

Spring Security 的 WebFlux 支持依赖于 WebFilter,并且对于 Spring WebFlux 和 Spring WebFlux.Fn 的工作方式相同。以下是一些示例应用程序展示了代码:

最小化 WebFlux 安全配置

以下清单展示了一个最小的 WebFlux 安全配置:

@Configuration
@EnableWebFluxSecurity
public class HelloWebfluxSecurityConfig {

@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}
}
java

此配置提供了表单和 HTTP 基本认证,设置了授权以要求访问任何页面的用户必须经过认证,设置了默认登录页面和默认注销页面,配置了与安全相关的 HTTP 头,添加了 CSRF 保护等功能。

显式 WebFlux 安全配置

以下页面展示了最小化 WebFlux 安全配置的显式版本:

@Configuration
@EnableWebFluxSecurity
public class HelloWebfluxSecurityConfig {

@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}

@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange(exchanges -> exchanges
.anyExchange().authenticated()
)
.httpBasic(withDefaults())
.formLogin(withDefaults());
return http.build();
}
}
java
备注

确保导入 org.springframework.security.config.web.server.invoke 函数,以便在类中启用 Kotlin DSL,因为 IDE 并不总是自动导入该方法,这可能会导致编译问题。

此配置明确设置了与我们最小配置相同的所有内容。从这里开始,您可以更轻松地对默认设置进行更改。

你可以在单元测试中找到更多显式配置的示例,通过搜索 config/src/test/ 目录中的 EnableWebFluxSecurity

多链支持

你可以配置多个 SecurityWebFilterChain 实例,通过 RequestMatcher 实例来分离配置。

例如,你可以为以 /api 开头的 URL 隔离配置:

@Configuration
@EnableWebFluxSecurity
static class MultiSecurityHttpConfig {

@Order(Ordered.HIGHEST_PRECEDENCE) 1
@Bean
SecurityWebFilterChain apiHttpSecurity(ServerHttpSecurity http) {
http
.securityMatcher(new PathPatternParserServerWebExchangeMatcher("/api/**")) 2
.authorizeExchange((exchanges) -> exchanges
.anyExchange().authenticated()
)
.oauth2ResourceServer(OAuth2ResourceServerSpec::jwt); 3
return http.build();
}

@Bean
SecurityWebFilterChain webHttpSecurity(ServerHttpSecurity http) { 4
http
.authorizeExchange((exchanges) -> exchanges
.anyExchange().authenticated()
)
.httpBasic(withDefaults()); 5
return http.build();
}

@Bean
ReactiveUserDetailsService userDetailsService() {
return new MapReactiveUserDetailsService(
PasswordEncodedUser.user(), PasswordEncodedUser.admin());
}

}
java
  • 配置一个带有 @OrderSecurityWebFilterChain,以指定 Spring Security 应首先考虑哪个 SecurityWebFilterChain

  • 使用 PathPatternParserServerWebExchangeMatcher 声明此 SecurityWebFilterChain 仅适用于以 /api/ 开头的 URL 路径

  • 指定将用于 /api/** 端点的认证机制

  • 创建另一个优先级较低的 SecurityWebFilterChain 实例以匹配所有其他 URL

  • 指定将用于应用程序其余部分的认证机制

Spring Security 会为每个请求选择一个 SecurityWebFilterChain @Bean。它会根据 securityMatcher 定义的顺序来匹配请求。

在这种情况下,这意味着如果 URL 路径以 /api 开头,Spring Security 将使用 apiHttpSecurity。如果 URL 不以 /api 开头,Spring Security 将默认使用 webHttpSecurity,它有一个隐含的 securityMatcher,可以匹配任何请求。