如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?
Posted
技术标签:
【中文标题】如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?【英文标题】:How can i add multiple user roles to single pathMatcher/Route in Spring WebFlux Security(Reactive Spring Security) Config? 【发布时间】:2019-12-29 04:35:15 【问题描述】:我有一条需要为多个用户进行身份验证的路由。对 spring cloud gateway 服务进行集成测试,以测试所有路由的安全性是否按预期工作。如何向单个 pathMatcher/route 添加超过 1 个用户角色?
使用 Spring Boot 2.1.6、Spring Cloud Finchely.SR2、Spring Cloud Gateway、Spring WebFlux Security(Reactive Spring Security)
@EnableWebFluxSecurity
public class SecurityConfig
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http)
http.csrf().disable()
.formLogin().disable()
.logout().disable()
.authorizeExchange()
.pathMatchers(prefix + "/publish/**")
.hasRole("XYZ_ROLE") //Here i want to add more than one user role
.anyExchange()
.authenticated().and().httpBasic();
【问题讨论】:
【参考方案1】:编辑:
查看spring security源码和github问题后发现hasAnyRole
和hasAnyAuthority
已经是implemented用于webflux的spring security,计划在Spring security v5.2.0中发布。
在撰写本文时,目前的稳定版本是 5.1.6,但 5.2.0 处于里程碑 4,因此应该很快就会发布。如果需要,您可以使用 5.2.0 的快照版本。
如果不使用快照,当前唯一的其他选择是实现您自己的自定义ReactiveAuthorizationManager
并使用ServerHttpSecurity.AuthorizeExchangeSpec#access 函数。
旧答案仅适用于标准弹簧安全而不适用于 WEBFLUX:
你可以试试hasAnyRole(String... roles)
【讨论】:
我正在使用spring webflux安全,没有可用的方法。 抱歉更新晚了,看到您找到了解决方法。我做了一些挖掘,并用更多信息更新了我的答案。【参考方案2】:在挖了兔子洞之后,我找到了使用 Reactive Spring Security 来授权多个角色的解决方案。在下面找到解决方案:
public class SecurityConfig
@Bean
public SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http)
http.csrf().disable()
.formLogin().disable()
.logout().disable()
.authorizeExchange()
.pathMatchers(prefix + "/publish/**").access((mono, context) -> mono
.map(auth -> auth.getAuthorities().stream()
//Authorizing for multiple user roles
.filter(e -> (e.getAuthority().equals("ROLE_ABC") || e.getAuthority().equals("ROLE_XYZ")))
.count() > 0)
.map(AuthorizationDecision::new))
.anyExchange()
.authenticated().and().httpBasic();
```
【讨论】:
以上是关于如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 WebFlux 在 Spring Boot 2 中设置登录页面?
如何在 Spring Boot WebFlux 中使用 GET 请求注销
如何使用WebFlux在Spring Boot 2中设置登录页面?