首页 > 解决方案 > 使用 Hystrix 在 Spring Cloud 中 shareSecurityContext 是如何工作的?

问题描述

我正在学习 Spring Cloud 的工作原理并为其使用最流行的技术堆栈之一:Eureka、Zuul、Hystrix、Ribbon、Feign。除了注册中心、配置服务器和网关之外,我的服务与 Spring Cloud 版本 2.2.1.RELEASE 有以下依赖关系:

<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-config</artifactId>
    <version>${spring-cloud.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-eureka-client</artifactId>
    <version>${spring-cloud.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-sleuth</artifactId>
    <version>${spring-cloud.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-openfeign</artifactId>
    <version>${spring-cloud.version}</version>
</dependency>
<dependency>
    <groupId>org.springframework.cloud</groupId>
    <artifactId>spring-cloud-starter-netflix-hystrix</artifactId>
    <version>${spring-cloud.version}</version>
</dependency>

我在网关上使用 JWT 进行授权,并希望在其他服务上使用相同的 Authorization 对象。这样做的明显方法是使用标头传输我的 JWT,但我在文档中读到 Hystrix 可以仅使用一个属性hystrix.shareSecurityContext=true传播整个安全上下文。我试过用 Feign Client 和 Zuul 来做,但是请求服务上的 SecurityContext 只包含anonymousUser。

我花了两天时间来了解它是如何工作的,但我没有。在 Feign 的日志中,我看不到任何带有 Principal 之类的标题。

所以这是我的问题:如果第二个服务在其他 docker 容器或其他服务器上运行,是否可以使用 Zuul 和 Feign 传输安全上下文?如果不是,传输有关授权用户的数据的最佳实践是什么?

谢谢!

标签: javaspring-bootspring-securitymicroservicesspring-cloud

解决方案


自您发布问题以来已经 8 个月了,但无论如何我都会回答。如您所知,服务本质上是分布式的,因此它们可能不共享 JVM,甚至它们可能根本不是用 Java 开发的。JWT 令牌的目的是保护此类分布式服务,因此无论它们之间发生什么有关安全性的通信,都仅通过授权标头进行。在授权标头中,一个服务将 JWT 令牌(仅限承载)传递给其他服务,该服务验证令牌,从中读取信息,等等。然而 hystrix.shareContext 有另一个目的。在 Spring 中创建应用程序上下文时,默认情况下它不会将其传递给 Hystrix 线程。为了使其对 Hystrix 可用,该属性设置为 true,这从本质上改变了 hystrix 的并发策略。所以,

希望这能解决您的疑问。


推荐阅读