您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件
Posted
技术标签:
【中文标题】您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件【英文标题】:How do you use spring-security OAuth2 behind a proxy, but only use ForwardedHeaderTransformer for the OAuth components 【发布时间】:2020-08-09 16:53:11 【问题描述】:我正在尝试将 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/");
【问题讨论】:
【参考方案1】:我得到它的工作添加以下内容吃服务 ID 之前的前缀。
spring:
cloud:
gateway:
discovery:
locator:
predicates:
- Path='/*/'+serviceId+'/**'
filters:
- StripPrefix=2
结合添加
@Bean
public ForwardedHeaderTransformer forwardedHeaderTransformer()
return new ForwardedHeaderTransformer();
【讨论】:
以上是关于您如何在代理后面使用 spring-security OAuth2,但仅将 ForwardedHeaderTransformer 用于 OAuth 组件的主要内容,如果未能解决你的问题,请参考以下文章
如果您在防火墙后面的 NAT 上,如何使用 php xdebug?
如何在代理设置后面使用 Google Speech to Text API?