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")
)

【讨论】:

谢谢,这行得通,但如果我正确理解 SEMAPHORETHREAD,我遇到问题的地方将是 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 实战笔记”,差距不是一点点

限量!Alibaba首发“SpringBoot实战笔记”,差距不是一点点!

Webflux 状态码无法更改

Spring:Spring简介

Angular DomSanitizer - SecurityContext.NONE