如何在 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问题后发现hasAnyRolehasAnyAuthority已经是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中设置登录页面?

如何使用 Spring Boot 对 WebFlux 进行异常处理?

如何使用 spring webflux 读取请求正文

Spring 5 webflux如何在Webclient上设置超时