基于某些标头值跳过 Spring Flux Security

Posted

技术标签:

【中文标题】基于某些标头值跳过 Spring Flux Security【英文标题】:Skip Spring Flux Security on the basis of some header values 【发布时间】:2021-09-15 16:18:20 【问题描述】:

我的要求完全不同,实际上我已经在 Spring Cloud API Gateway(基于 WebFlux)中添加了安全性,现在基本上我想根据端点 /testAPI/ 上存在的一些标头值跳过 OAuth 资源服务器完整流程** 否则 OAuth 资源服务器流程将在相同的端点 /testAPI/** 上启动

安全配置

    @Autowired
    private ReactiveAuthenticationManager manager;
    

    @Bean
    SecurityWebFilterChain springSecurityFilterChain(ServerHttpSecurity http) 
        return http
                .authorizeExchange()
                
                .pathMatchers("/testAPI/**").authenticated()
                .anyExchange().permitAll()
                .and()
                
                .securityContextRepository(NoOpServerSecurityContextRepository.getInstance())
                
                .httpBasic().disable()
                .formLogin().disable()
                .csrf().disable()
                .logout().disable()
                .oauth2ResourceServer()
                    .jwt()
                    .authenticationManager(manager)
                .and()
                .and()
                
                .addFilterBefore(new SecurityWebFilter(), SecurityWebFiltersOrder.AUTHENTICATION)
                
                .build();

在 SecurityWebFilter 中,我尝试了使用自定义身份验证的 ReactiveSecurityContextHolder.withAuthentication(..),方法是将其设置为 true 并使用

Mono<Authentication> authentication = ReactiveSecurityContextHolder.getContext().map(SecurityContext::getAuthentication)
                .doOnSuccess(auth -> 
                    auth.setAuthenticated(true);
                );

没有什么对我有用,我可以使用 OAuth 服务器进行验证,但我想在相同的端点上有条件地跳过它。

请帮忙,我是 WebFlux 的新手,正在探索 Spring 安全性。

【问题讨论】:

【参考方案1】:

我创建了一个自定义匹配器

private ServerWebExchangeMatcher authorizationHeaderMatcher() 
        return (exchange) -> exchange.getRequest().getHeaders().containsKey(HttpHeaders.AUTHORIZATION)
                ? MatchResult.match()
                : MatchResult.notMatch();

    

在 SecurityConfig 中配置相同

.securityMatcher(customAuthorizationMatcher())
                .authorizeExchange()
                .pathMatchers("/testAPI/**").authenticated()

【讨论】:

以上是关于基于某些标头值跳过 Spring Flux Security的主要内容,如果未能解决你的问题,请参考以下文章

Spring WebFlux(Flux):如何动态发布

Flux 会取代 Web MVC,或可不再基于 Servlet 容器了?

spring cloud gateway 某些路由中跳过全局过滤器

我可以使用从 Spring5 的 WebClient 返回的 Flux 的 block() 方法吗?

如何有选择地跳过 Flux 上的几个处理步骤

荧客技荐Flux 会取代 Web MVC,或可不再基于 Servlet 容器了?