13

在从 Spring Cloud 切换Brixton.M5Brixton.RC1我的 ZuulProxy 时,不再将Authorization标头下游传递给我的代理服务。

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

需要注意的是 MyZuulProxy 没有任何安全依赖;它将接收到的标头传递Authorization: Bearer {JWT}给 ResourceServers,pre-RC1。MyZuulProxy 本身明确不是客户端,目前不使用@EnableOAuth2SSO或类似。

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

要发布的代码很少:它只是@EnableZuulProxy,@EnableAuthorizationServer并且@EnableResourceServer在三个不同的 jar 中。我的客户不是 Spring 应用程序。

4

2 回答 2

37

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

敏感头也可以全局设置zuul.sensitiveHeaders。如果sensitiveHeaders在路由上设置,这将覆盖全局sensitiveHeaders设置。

所以使用:

# 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;
    }
}
于 2016-04-01T20:03:16.060 回答
12

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

 zuul:
  sensitiveHeaders: Cookie,Set-Cookie

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

于 2017-06-07T08:20:16.527 回答