2016-12-30 1 views
1

Я пытаюсь получить весенний контекст безопасности для распространения через поток сообщений async для интеграции Spring, но обнаружил, что хотя я добавил SecurityContextPropagationChannelInterceptor, контекст безопасности всегда заканчивается нулевым значением мой обработчик сообщений.Как распространять Spring Security Context в Spring Интеграция async messaging gateway

@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 нет - просто правильный способ работы с безопасностью.

В ближайшее время добавит такой трюк в Справочное руководство.

Запросить информацию по данному вопросу: https://github.com/spring-projects/spring-integration/pull/2015

+0

Привет! Это почти сработало, за исключением того, что я обнаружил, что мне пришлось подклассифицировать «DelegatingSecurityContextAsyncTaskExecutor», поскольку он не реализовал интерфейс AsyncListenableTaskExecutor. Должен ли я поднять запрос на изменение командой Spring Security, чтобы изменить ее для реализации «AsyncListenableTaskExecutor»? –

+0

Да, пожалуйста: https://github.com/spring-projects/spring-security/issues. –

Смежные вопросы