跳到主要内容

授权 ServerHttpRequest

QWen Max 中英对照 Authorize HTTP Requests Authorize ServerHttpRequest

Spring Security 提供了对传入 HTTP 请求进行授权的支持。默认情况下,Spring Security 的授权将要求所有请求都经过身份验证。显式配置如下:

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

我们可以配置 Spring Security 以通过优先级顺序添加更多规则来具有不同的规则。

import static org.springframework.security.authorization.AuthorityReactiveAuthorizationManager.hasRole;
// ...
@Bean
SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
http
// ...
.authorizeExchange((authorize) -> authorize 1
.pathMatchers("/resources/**", "/signup", "/about").permitAll() 2
.pathMatchers("/admin/**").hasRole("ADMIN") 3
.pathMatchers("/db/**").access((authentication, context) -> 4
hasRole("ADMIN").check(authentication, context)
.filter(decision -> !decision.isGranted())
.switchIfEmpty(hasRole("DBA").check(authentication, context))
)
.anyExchange().denyAll() 5
);
return http.build();
}
java
  • 指定了多个授权规则。每个规则按声明的顺序进行考虑。

  • 我们指定了多个任何用户都可以访问的 URL 模式。具体来说,如果 URL 以 "/resources/" 开头、等于 "/signup" 或等于 "/about",则任何用户都可以访问该请求。

  • 任何以 "/admin/" 开头的 URL 将限制为具有 "ROLE_ADMIN" 权限的用户。请注意,由于我们调用了 hasRole 方法,因此不需要指定 "ROLE_" 前缀。

  • 任何以 "/db/" 开头的 URL 要求用户同时具有 "ROLE_ADMIN" 和 "ROLE_DBA"。这展示了提供自定义 ReactiveAuthorizationManager 的灵活性,允许我们实现任意授权逻辑。为了简单起见,示例使用了一个 lambda 表达式,并委托给现有的 AuthorityReactiveAuthorizationManager.hasRole 实现。然而,在实际情况下,应用程序可能会在一个实现 ReactiveAuthorizationManager 的适当类中实现该逻辑。

  • 任何尚未匹配的 URL 都将被拒绝访问。如果您不希望意外忘记更新授权规则,这是一个很好的策略。