授权 ServerHttpRequest
本站(springdoc.cn)中的内容来源于 spring.io ,原始版权归属于 spring.io。由 springdoc.cn 进行翻译,整理。可供个人学习、研究,未经许可,不得进行任何转载、商用或与之相关的行为。 商标声明:Spring 是 Pivotal Software, Inc. 在美国以及其他国家的商标。 |
Spring Security提供了对传入的HTTP请求进行授权的支持。默认情况下,Spring Security的授权将要求所有的请求都要经过认证。明确的配置看起来像:
All Requests Require Authenticated User
-
Java
-
Kotlin
@Bean
SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) {
http
.authorizeExchange(exchanges -> exchanges
.anyExchange().authenticated()
)
.httpBasic(withDefaults())
.formLogin(withDefaults());
return http.build();
}
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
return http {
authorizeExchange {
authorize(anyExchange, authenticated)
}
formLogin { }
httpBasic { }
}
}
我们可以通过按优先顺序添加更多的规则来配置Spring Security的不同规则。
Multiple Authorize Requests Rules
-
Java
-
Kotlin
import static org.springframework.security.authorization.AuthorityReactiveAuthorizationManager.hasRole;
// ...
@Bean
SecurityWebFilterChain springWebFilterChain(ServerHttpSecurity http) {
// @formatter:off
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)
);
// @formatter:on
return http.build();
}
@Bean
fun springSecurityFilterChain(http: ServerHttpSecurity): SecurityWebFilterChain {
return http {
authorizeExchange { (1)
authorize(pathMatchers("/resources/**", "/signup", "/about"), permitAll) (2)
authorize("/admin/**", hasRole("ADMIN")) (3)
authorize("/db/**", { authentication, context -> (4)
hasRole("ADMIN").check(authentication, context)
.filter({ decision -> !decision.isGranted() })
.switchIfEmpty(hasRole("DBA").check(authentication, context))
})
authorize(anyExchange, denyAll) (5)
}
// ...
}
}
1 | 有多个授权规则被指定。每条规则都是按照它们的声明顺序来考虑的。 |
2 | 我们指定了多种URL pattern式,任何用户都可以访问。具体来说,如果URL以"/resources/"开头,等于"/signup",或等于"/about",任何用户都可以访问一个请求。 |
3 | 任何以 "/admin/" 开头的URL将被限制给拥有 "ROLE_ADMIN" 权限的用户。你会注意到,由于我们调用的是 hasRole 方法,我们不需要指定 "ROLE_" 前缀。 |
4 | 任何以 "/db/" 开头的URL都要求用户同时拥有 "ROLE_ADMIN" 和 "ROLE_DBA"。这展示了提供一个自定义 ReactiveAuthorizationManager 的灵活性,允许我们实现任意的授权逻辑。为了简单起见,这个例子使用了一个 lambda 和委托给现有的 AuthorityReactiveAuthorizationManager.hasRole 实现。然而,在现实世界中,应用程序可能会在一个实现 ReactiveAuthorizationManager 的适当的类中实现这些逻辑。 |
5 | 任何还没有被匹配的URL都会被拒绝访问。如果你不想意外地忘记更新你的授权规则,这是一个好的策略。 |