Spring security 如何在Spring集成异步消息网关中传播Spring安全上下文

Spring security 如何在Spring集成异步消息网关中传播Spring安全上下文,spring-security,spring-integration,Spring Security,Spring Integration,我试图让spring安全上下文通过spring integration异步消息流传播,但发现即使我添加了SecurityContextPropagationChannelInterceptor,安全上下文在我的消息处理程序中始终为空 @Bean @GlobalChannelInterceptor(patterns = {"*"}) public ChannelInterceptor securityContextPropagationInterceptor() { return new

我试图让spring安全上下文通过spring integration异步消息流传播,但发现即使我添加了
SecurityContextPropagationChannelInterceptor
,安全上下文在我的消息处理程序中始终为空

@Bean
@GlobalChannelInterceptor(patterns = {"*"})
public ChannelInterceptor securityContextPropagationInterceptor()
{
    return new SecurityContextPropagationChannelInterceptor();
}
我通过调用我的网关接口,从具有填充的安全上下文的服务启动流:

@MessagingGateway
public interface AssignmentsService
{
    @Gateway(requestChannel = "applyAssignmentsFlow.input")
    ListenableFuture<AssignmentResult> applyAssignments( AssignmentRequest assignmentRequest );
}
@MessagingGateway
公共接口分配服务
{
@网关(requestChannel=“applyAssignmentsFlow.input”)
可列出的未来应用程序签名(AssignmentRequest AssignmentRequest);
}
在进一步调试时,我发现
GatewayProxyFactoryBean
在启动我的流时创建了一个新线程,但没有传播安全上下文


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

这是一项非常有趣的任务。真的:)

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

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

...

@MessagingGateway(asyncExecutor = "securityContextExecutor")
public interface AssignmentsService
这里的主要技巧来自Spring安全性及其并发性,我们应该使用
TaskExecutor
wrappers来获取当前的
SecurityContext
,并将其传播到新生成的线程中

不过,Spring集成并没有什么意义,它只是处理安全性的正确方法

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


关于此事的请求:

Hi!这几乎奏效了,但我发现我必须为DelegatingSecurityContextAsyncTaskExecutor创建子类,因为它没有实现AsyncListenableTaskExecutor接口。我是否应该向Spring安全团队提出更改请求,以将其更改为实现
AsyncListenableTaskExecutor
?是的,请:。