如何在RouterFuncation bean中的WebClient上应用Spring Cloud Gateway GlobalFilter?

时间:2018-01-15 09:55:52

标签: spring spring-boot spring-cloud spring-webflux

目前我正在尝试在边缘服务中使用Spring Cloud Gateway(Spring Cloud版本:Finchley.M5),我的示例有一个Spring Session标头( X-AUTH-TOKEN )令牌认证

  1. 在特定于网关RouteLocator中,身份验证效果很好,因为内置的GlobalFilters在将请求传递给下游微服务时会应用于RouteLocator

  2. 但是我想创建一个通用的RouterFunction来消耗下游服务的一些资源,并在一个新的边缘服务中将它们聚合在一起,GlobalFileters将不会应用于我的webclient bean。

    @Bean
    RouterFunction<ServerResponse> routes(WebClient webClient) {
    log.debug("authServiceUrl:{}", this.authServiceUrl);
    log.debug("postServiceUrl:{}", this.postServiceUrl);
    log.debug("favoriteServiceUrl:{}", this.favoriteServiceUrl);
    
    return route(
        GET("/posts/{slug}/favorited"),
        (req) -> {
            Flux<Map> favorites = webClient
                .get()
                .uri(favoriteServiceUrl + "/posts/{slug}/favorited", req.pathVariable("slug"))
                .retrieve()
                .bodyToFlux(Map.class);
    
            Publisher<Map> cb = from(favorites)
                .commandName("posts-favorites")
                .fallback(Flux.just(Collections.singletonMap("favorited", false)))
                .eager()
                .build();
    
            return ok().body(favorites, Map.class);
        }
    )
    ...
    
  3. 是否有一个应用网关过滤器的简单解决方案也适用于RouterFunction,因此我的基于标头令牌的身份验证可以自动运行?

    或者有一种简单的方法可以将当前的 X-AUTH-TOKEN 标头传递到下游的webclient请求标头中?

    在传统的MVC中,有一个RequestContext用于从当前请求上下文中获取所有头,并将它们传递给全局过滤器中的下游请求。 webflux中是否有RequestContext的替代方法可以读取当前请求上下文中的所有标题?

    完整代码为here

0 个答案:

没有答案