您如何在代理后面使用 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?

如何从代理后面使用 sbt?

如何在防火墙/代理后面使用 Firebase?

如何在公司代理后面使用 spark-shell 解析外部包?

如何在代理后面使用 sbt - 在 Windows 7 中?