Spring Cloud Gateway Server MVC 为所有请求添加来自身份验证的标头

问题描述 投票:0回答:1

我找到了Spring React Cloud Gateway的解决方案,但是如何在没有Webflux的Spring Cloud Gateway Server MVC中做到这一点? Spring云网关从身份验证添加标头 Spring Cloud Gateway 注入标头

我尝试通过在我的网关中实现 HttpServletRequestWrapper 来实现此目的,如此处所述 在 servlet 过滤器中向请求添加 HTTP 标头,但我发现发送到另一个微服务的请求缺少我的标头。

UPD:此处指定的实现选项也有效在 servlet 过滤器中向请求添加 HTTP 标头

spring-mvc spring-cloud-gateway request-headers
1个回答
0
投票
    @Bean
    public RouterFunction<ServerResponse> gatewayRouterFunctionsAddReqHeader(
            AuthenticationHeadersFilter authenticationHeadersFilter,
            GatewayConfig gatewayConfig
    ) {
        ServiceProperties serviceProperties = gatewayConfig.getServices()
                .getOrDefault(CONTENT_SERVICE_NAME, new ServiceProperties());
        return route("content_service_content")
                .PUT("/v1/content/user", http(serviceProperties.getUri()))
                .before(authenticationHeadersFilter.addRequestHeader())
                .build();
    };

    @Component
    public class AuthenticationHeadersFilter {
    private final AuthClient authServiceClient;

    public AuthenticationHeadersFilter(AuthClient authServiceClient) {
        this.authServiceClient = authServiceClient;
    }

    public Function<ServerRequest, ServerRequest> addRequestHeader() {
        return request -> {
            String token = request.servletRequest().getHeader(HttpHeaders.AUTHORIZATION);
            if (StringUtils.isNotBlank(token) && token.startsWith("Bearer ")) {
                JwtResponse validUser = authServiceClient.getValidUser(token.substring(7));
                Consumer<HttpHeaders> headers = httpHeaders -> {
                    httpHeaders.add(Headers.EMAIL, validUser.getEmail());
                    httpHeaders.add(Headers.USER_ID, validUser.getId().toString());
                    httpHeaders.add(Headers.ROLES, String.join(",", validUser.getRoles().stream().map(Enum::name).toList()));
                    httpHeaders.add(Headers.LAST_NAME, validUser.getLastName());
                };
                return ServerRequest.from(request)
                        .headers(headers)
                        .build();
            } else {
                throw new ResponseCodeException(new BadRequestError("Invalid token"));
            }
        };
    }

}
© www.soinside.com 2019 - 2024. All rights reserved.