Spring 是不是使 SecurityContext 可用于执行 Hystrix 命令的线程
Posted
技术标签:
【中文标题】Spring 是不是使 SecurityContext 可用于执行 Hystrix 命令的线程【英文标题】:Does Spring make the SecurityContext available to the thread executing a Hystrix CommandSpring 是否使 SecurityContext 可用于执行 Hystrix 命令的线程 【发布时间】:2015-06-16 11:42:51 【问题描述】:我正在运行一个 spring boot 应用程序,并且刚刚开始从 spring-cloud-netflix 集成 Hystrix。我正在使用 @HystrixCommand 来包装使用 feign 客户端进行的服务到服务调用。
@HystrixCommand(fallbackMethod = "updateThingFallback")
def updateRemoteThing(thingResourceClient: ThingResourceClient, thing: Thing)
thingResourceClient.updateThing(thing) // Call using feign client
这个 feign 客户端使用 spring 安全上下文向它发出的请求添加安全标头。
我遇到的问题是,当执行 HystrixCommand 时,它在 Hystrix 线程池的单独线程中运行,当我的代码尝试访问 spring 安全上下文时,它在新线程上不可用。
我正在像这样访问 spring 安全上下文:
SecurityContextHolder.getContext().getAuthentication();
我的问题是,spring 是否提供了一种将 spring 安全上下文(和应用程序上下文)传递给运行 Hystrix 命令的 Hystrix 线程的方法?
【问题讨论】:
【参考方案1】:由于Spring Cloud Netflix 1.2.0,您可以使用配置参数启用与 Hystrix 的安全上下文共享:
hystrix.shareSecurityContext: true
【讨论】:
btw IDEA 会警告您Cannot resolve configuration property 'hystrix.shareSecurityContext'
,但它仍然可以正常工作。【参考方案2】:
您应该能够通过正常方式在您的 bean 中获取 ApplicationContext
。我可以看到两种传递身份验证对象的方法:1)作为方法的参数,或 2)使用 Semaphore isolation 而不是在单独的线程上运行 hystrix。
@HystrixCommand(fallbackMethod = "updateThingFallback", commandProperties =
@HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")
)
【讨论】:
谢谢,这行得通,但如果我正确理解SEMAPHORE
和 THREAD
,我遇到问题的地方将是 THREAD 的理想选择:对远程服务的网络调用,在最好的情况下不是很快,而且经常完全爆炸。所以我猜我最好的选择是重新编写代码以将身份验证作为参数传递?【参考方案3】:
我解决了这个问题:solution example 但是这个例子是针对一个 spring-boot 应用程序,我将它应用在 Tomcat 7 中,两个主要变化是:
-
过滤器是在 web.xml 中创建的。
在“class HystrixRequestContextEnablerFilter”的初始化中我添加了:`
@Override
public void init(FilterConfig filterConfig) throws ServletException
HystrixPlugins.getInstance().registerCommandExecutionHook(new SecurityContextRegistratorCommandHook());
【讨论】:
【参考方案4】:或者,您可以使用 DelegatingSecurityContextExecutor 包装 Hystrix 使用的 Executor。
见https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#delegatingsecuritycontextexecutor
【讨论】:
以上是关于Spring 是不是使 SecurityContext 可用于执行 Hystrix 命令的线程的主要内容,如果未能解决你的问题,请参考以下文章
使用 Gson/Jackson 和 Spring Boot 重新创建没有字段属性的 DTO 类,而不是使其为空
顶啊!Alibaba 首发“SpringBoot 实战笔记”,差距不是一点点