[英]How does shareSecurityContext work in Spring Cloud with Hystrix?
我正在学习 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 进行授权,并希望在其他服务上使用相同的授权对象。 这样做的明显方法是使用标头传输我的 JWT,但我在文档中读到 Hystrix 可以仅使用一个属性hystrix.shareSecurityContext=true传播整个安全上下文。 我试过用 Feign Client 和 Zuul 来做,但请求服务上的 SecurityContext 只包含anonymousUser。
我花了两天时间了解它是如何工作的,但我没有。 在 Feign 的日志中,我没有看到任何带有 Principal 之类的标题。
所以这是我的问题:如果第二个服务在其他 docker 容器或其他服务器上运行,是否可以使用 Zuul 和 Feign 传输安全上下文? 如果不是,传输有关授权用户的数据的最佳实践是什么?
谢谢!
自从您发布问题以来已经 8 个月了,但无论如何我都会回答。 如您所知,服务本质上是分布式的,因此它们可能不共享 JVM,甚至可能根本不是用 Java 开发的。 JWT 令牌的目的是保护此类分布式服务,因此它们之间发生的有关安全性的任何通信都仅通过授权标头发生。 在授权标头中,一个服务将 JWT 令牌(仅承载)传递给其他服务,该服务验证令牌,从中读取信息,等等。 然而 hystrix.shareContext 有另一个目的。 在 Spring 中,当创建应用程序上下文时,默认情况下它不会将其传递给 Hystrix 线程。 为了使其可用于 Hystrix,此属性设置为 true,这从本质上改变了 hystrix 的并发策略。 因此,它将安全上下文传递给“Hystrix 的线程”,它是同一服务的一部分,而不是其他服务的一部分。
希望这能解决您的疑问。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.