我试图让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
在启动流时创建了一个新线程,但没有传播安全上下文。
我已经搜索过但无法找到如何配置它来传播安全上下文。
答案 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