以 Brixton.RC1 开头的 ZuulProxy 未通过授权 header

Authorization header not passed by ZuulProxy starting with Brixton.RC1

从 Spring 云 Brixton.M5 切换到 Brixton.RC1 我的 ZuulProxy 不再将 Authorization header 下游传递到我的代理服务。

我的设置中有各种角色在起作用,但大多数都相当简单: - AuthorizationServer:单独运行;将 JWT 分发给客户 - 客户端:从 OAuth 服务器获取 JWT;每个人都可以访问一部分资源。 - ResourceServers:使用 JWT 进行访问决策 - MyZuulProxy:代理各种资源服务器;应该中继 JWT。

需要注意的是,MyZuulProxy 没有任何安全依赖;它将收到的 Authorization: Bearer {JWT} header 传递给 RC1 之前的资源服务器。 MyZuulProxy 本身显然不是客户端,目前不使用 @EnableOAuth2SSO 或类似的东西。

在使用 Spring Cloud Brixton.RC1 时,我该怎么做才能让 MyZuulProxy 再次将 JWT 中继到 ResourceServers?

post 的代码很少:只有 @EnableZuulProxy@EnableAuthorizationServer@EnableResourceServer 在三个不同的 jar 中。我的客户不是 Spring 应用程序。

更新:已在 https://github.com/spring-cloud/spring-cloud-netflix/pull/963/files

中修复

Sensitive headers can also be set globally setting zuul.sensitiveHeaders. If sensitiveHeaders is set on a route, this will override the global sensitiveHeaders setting.

所以使用:

# Pass Authorization header downstream
zuul:
  sensitiveHeaders: Cookie,Set-Cookie

因此,等待 https://github.com/spring-cloud/spring-cloud-netflix/issues/944, jebeaudet 的修复足以提供解决方法:

@Component
public class RelayTokenFilter extends ZuulFilter {

    @Override
    public Object run() {
        RequestContext ctx = RequestContext.getCurrentContext();

        // Alter ignored headers as per: https://gitter.im/spring-cloud/spring-cloud?at=56fea31f11ea211749c3ed22
        Set<String> headers = (Set<String>) ctx.get("ignoredHeaders");
        // We need our JWT tokens relayed to resource servers
        headers.remove("authorization");

        return null;
    }

    @Override
    public boolean shouldFilter() {
        return true;
    }

    @Override
    public String filterType() {
        return "pre";
    }

    @Override
    public int filterOrder() {
        return 10000;
    }
}

全局设置 sensitiveHeaders 帮我解决了问题

 zuul:
  sensitiveHeaders: Cookie,Set-Cookie

请注意 属性 名称是 sensitiveHeaders not sensitive-headers [我使用 spring-cloud-starter-zuul version:1.3.1.RELEASE ]