|
此版本仍在开发中,尚未被视为稳定版本。如需最新稳定版本,请使用 Spring Security 7.0.4! |
WebFlux 安全
Spring Security 的 WebFlux 支持依赖于一个 WebFilter,并且在 Spring WebFlux 和 Spring WebFlux.Fn 中的工作方式相同。
一些示例应用展示了相关的代码:
-
您好 WebFlux hellowebflux
-
Hello WebFlux.Fn hellowebfluxfn
-
Hello WebFlux 方法 hellowebflux-method
最小的WebFlux安全配置
以下示例显示了最小化的WebFlux安全配置:
-
Java
-
Kotlin
@Configuration
@EnableWebFluxSecurity
public class HelloWebfluxSecurityConfig {
@Bean
public MapReactiveUserDetailsService userDetailsService() {
UserDetails user = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build();
return new MapReactiveUserDetailsService(user);
}
}
@Configuration
@EnableWebFluxSecurity
class HelloWebfluxSecurityConfig {
@Bean
fun userDetailsService(): ReactiveUserDetailsService {
val userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build()
return MapReactiveUserDetailsService(userDetails)
}
}
此配置提供了表单和HTTP基本身份验证,设置了访问任何页面都需要经过认证的用户进行授权,设置了默认登录页面和默认注销页面,设置了相关的安全HTTP头信息,并添加了CSRF保护等。
显式的WebFlux 安全配置
以下页面展示了一个显式的最小WebFlux 安全配置版本:
-
Java
-
Kotlin
@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();
}
}
import org.springframework.security.config.web.server.invoke
@Configuration
@EnableWebFluxSecurity
class HelloWebfluxSecurityConfig {
@Bean
fun userDetailsService(): ReactiveUserDetailsService {
val userDetails = User.withDefaultPasswordEncoder()
.username("user")
.password("user")
.roles("USER")
.build()
return MapReactiveUserDetailsService(userDetails)
}
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
return http {
authorizeExchange {
authorize(anyExchange, authenticated)
}
formLogin { }
httpBasic { }
}
}
}
请确保导入org.springframework.security.config.web.server.invoke功能以在您的类中启用Kotlin DSL,因为IDE不会总是自动导入该方法,可能会导致编译问题。 |
此配置显式设置了所有与我们最小化配置相同的内容。 从这里,您可以更轻松地更改默认设置。
您可以在单元测试中找到更多显式配置的示例,只需在 config/src/test/ 目录中搜索 EnableWebFluxSecurity 即可。
支持多链
你可以通过SecurityWebFilterChain实例来配置多个RequestMatcher实例,以实现不同的安全配置。
例如,您可以隔离以/api开头的URL的配置:
-
Java
-
Kotlin
@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());
}
}
import org.springframework.security.config.web.server.invoke
@Configuration
@EnableWebFluxSecurity
open class MultiSecurityHttpConfig {
@Order(Ordered.HIGHEST_PRECEDENCE) (1)
@Bean
open fun apiHttpSecurity(http: ServerHttpSecurity): SecurityWebFilterChain {
return http {
securityMatcher(PathPatternParserServerWebExchangeMatcher("/api/**")) (2)
authorizeExchange {
authorize(anyExchange, authenticated)
}
oauth2ResourceServer {
jwt { } (3)
}
}
}
@Bean
open fun webHttpSecurity(http: ServerHttpSecurity): SecurityWebFilterChain { (4)
return http {
authorizeExchange {
authorize(anyExchange, authenticated)
}
httpBasic { } (5)
}
}
@Bean
open fun userDetailsService(): ReactiveUserDetailsService {
return MapReactiveUserDetailsService(
PasswordEncodedUser.user(), PasswordEncodedUser.admin()
)
}
}
| 1 | 配置一个带有SecurityWebFilterChain的@Order,以指定Spring Security应该首先考虑哪个SecurityWebFilterChain |
| 2 | 使用PathPatternParserServerWebExchangeMatcher来声明这个SecurityWebFilterChain仅应用于以/api/开头的URL路径。 |
| 3 | 指定将用于 /api/** 端点的身份验证机制 |
| 4 | 创建另一个具有较低优先级的SecurityWebFilterChain实例,以匹配所有其他URL |
| 5 | 指定将用于整个应用程序的身份验证机制 |
Spring Security 为每个请求选择一个 SecurityWebFilterChain @Bean。
它按照 securityMatcher 定义的顺序匹配请求。
在这种情况中,这意味着如果 URL 路径以 /api 开始,Spring Security 使用 apiHttpSecurity。
否则,如果 URL 不以 /api 开始,Spring Security 默认使用 webHttpSecurity,后者具有隐含的 securityMatcher,匹配任何请求。