如何在Spring集成异步消息传递网关中传播Spring Security Context

时间:2016-12-30 21:59:22

标签: spring-security spring-integration

我试图让Spring安全上下文通过spring集成异步消息流进行传播,但是发现即使我添加了SecurityContextPropagationChannelInterceptor,安全上下文总是在我的消息处理程序中以null结尾。

@Bean
@GlobalChannelInterceptor(patterns = {"*"})
public ChannelInterceptor securityContextPropagationInterceptor()
{
    return new SecurityContextPropagationChannelInterceptor();
}

我通过调用网关接口从具有填充安全上下文的服务启动流程:

@MessagingGateway
public interface AssignmentsService
{
    @Gateway(requestChannel = "applyAssignmentsFlow.input")
    ListenableFuture<AssignmentResult> applyAssignments( AssignmentRequest assignmentRequest );
}

在进一步调试时,我发现GatewayProxyFactoryBean在启动流时创建了一个新线程,但没有传播安全上下文。

我已经搜索过但无法找到如何配置它来传播安全上下文。

1 个答案:

答案 0 :(得分:3)

这是非常有趣的任务。确实 :) !

但无论如何你可以这样做:

@Bean
public AsyncTaskExecutor securityContextExecutor() {
    return new DelegatingSecurityContextAsyncTaskExecutor(new SimpleAsyncTaskExecutor());
}

...

@MessagingGateway(asyncExecutor = "securityContextExecutor")
public interface AssignmentsService

这里的主要技巧来自Spring Security及其并发utils,我们应该使用TaskExecutor包装器来获取当前SecurityContext并将其传播到新生成的Thread中。

但是,没有任何关于Spring Integration的方法 - 只是使用安全性的正确方法。

很快就会在参考手册中添加这样的技巧。

就此事提出请求:https://github.com/spring-projects/spring-integration/pull/2015