我找到了Spring React Cloud Gateway的解决方案,但是如何在没有Webflux的Spring Cloud Gateway Server MVC中做到这一点? Spring云网关从身份验证添加标头 Spring Cloud Gateway 注入标头
我尝试通过在我的网关中实现 HttpServletRequestWrapper 来实现此目的,如此处所述 在 servlet 过滤器中向请求添加 HTTP 标头,但我发现发送到另一个微服务的请求缺少我的标头。
UPD:此处指定的实现选项也有效在 servlet 过滤器中向请求添加 HTTP 标头
@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"));
}
};
}
}