【问题标题】:How can i add multiple user roles to single pathMatcher/Route in Spring WebFlux Security(Reactive Spring Security) Config?如何在 Spring WebFlux Security(Reactive Spring Security)配置中将多个用户角色添加到单个 pathMatcher/Route?
【发布时间】: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();
        }
}

【问题讨论】:

    标签: java spring-security spring-webflux spring-cloud-gateway


    【解决方案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();
            }
    }```
    
    
    

    【讨论】:

      猜你喜欢
      • 2011-08-02
      • 2015-08-15
      • 2016-10-03
      • 2017-11-02
      • 2018-03-21
      • 2016-10-16
      • 2014-09-14
      • 2019-12-19
      相关资源
      最近更新 更多