2016-12-30 64 views
1

傳播Spring安全上下文我想通過Spring集成異步消息流傳播spring安全上下文,但發現即使我添加了SecurityContextPropagationChannelInterceptor安全上下文總是以null結尾我的消息處理器。如何在Spring集成異步消息傳遞網關

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

我開始從通過撥打電話到我的網關接口有一個人口稠密的安全上下文服務我的流程:

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

關於進一步調試我發現,GatewayProxyFactoryBean創建一個新線程時啓動我的流程,但不傳播安全上下文。

我已經搜索,但一直無法找到如何配置此傳播安全上下文。

回答

2

這是非常有趣的任務。確實 :) !

但無論如何,你可以做這樣的:

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

... 

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

這裏的主要技巧是使用Spring Security和它的併發utils,我們應該用TaskExecutor包裝拿起當前SecurityContext,並傳播到新產生線程。

雖然沒有什麼關於Spring Integration的 - 只是使用Security的正確方法。

很快就會在參考手冊中添加這樣的技巧。

關於此事的拉求:https://github.com/spring-projects/spring-integration/pull/2015

+0

嗨!這幾乎工作,除了我發現我不得不繼承'DelegatingSecurityContextAsyncTaskExecutor',因爲它沒有實現'AsyncListenableTaskExecutor'接口。我應該向Spring Security團隊提出一個更改請求,將其更改爲實現'AsyncListenableTaskExecutor'? –

+0

是的,請:https://github.com/spring-projects/spring-security/issues。 –

相關問題