我正在尝试将 Spring Cloud Gateway 与 Discovery Client 与 Spring Security 与 OAuth 合并。除了无法同时执行 OAuth 和 Discovery Client 之外,我的大部分工作都已完成。
当我使用 Discovery Client 时,它会正确解析服务,例如 /v1/whoami
转到请求 /
的 whoami
服务,当我启用安全性,当它尝试请求 /oauth/authorization/google
时,我会收到 404,因为它应该是 /v1/oauth/authorization/google
为了解决上述问题,我添加了这个
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
return new ForwardedHeaderTransformer();
}
但是,当我这样做时,它会将/v1/whoami 查找为不存在的/v1/whoami。
我尝试创建并注册此类,但它也不起作用
public class ForwardedHeaderTransformerForOAuthOnly extends ForwardedHeaderTransformer {
@Override
public ServerHttpRequest apply(ServerHttpRequest request) {
System.out.println(">>>> " + request.getPath().value());
if (isOauth(request)) {
System.out.println(">>>> IS OAUTH");
return super.apply(request);
}
return request;
//return super.apply(request);
}
private boolean isOauth(ServerHttpRequest request) {
return request.getPath().value().startsWith("/oauth2/authorization/") || request.getPath().value().startsWith("/login/oauth2/code/");
}
}
最佳答案
我添加了以下内容,以在服务 ID 之前使用前缀。
spring:
cloud:
gateway:
discovery:
locator:
predicates:
- Path='/*/'+serviceId+'/**'
filters:
- StripPrefix=2
结合添加
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer() {
return new ForwardedHeaderTransformer();
}
关于java - 如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61436781/