2016-12-30 10 views
1

Ich versuche, Frühling Sicherheitskontext durch eine Feder Integration async Nachrichtenfluss zu verbreiten, aber habe festgestellt, dass, obwohl ich SecurityContextPropagationChannelInterceptor hinzugefügt der Sicherheitskontext endet immer Null in mein Nachrichtenhandler.Wie Spring Sicherheitskontext in Spring-Integration async Messaging-Gateway

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

ich initiieren meine Flow aus einem Dienst, der durch einen Anruf zu meiner Gateway-Schnittstelle einen besiedelten Sicherheitskontext hat:

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

Bei der weiteren Fehlersuche hat ich gefunden, dass die GatewayProxyFactoryBean einen neuen Thread erstellt, wenn Initiieren meines Flusses, aber nicht den Sicherheitskontext.

Ich habe gesucht, aber konnte nicht herausfinden, wie dies konfiguriert wird, um den Sicherheitskontext zu verbreiten.

Antwort

2

Das ist ziemlich interessante Aufgabe. Tatsächlich :) !

Aber trotzdem können Sie es wie folgt tun:

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

... 

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

Der wichtigste Trick hier von Spring Security und seine Gleichzeitigkeit utils, wo wir TaskExecutor Wrapper verwenden sollten die aktuelle SecurityContext zu holen und propagieren sie neu in gespawter Thread.

Es gibt jedoch nichts über Spring Integration - nur die richtige Art, mit Security zu arbeiten.

Wird einen solchen Trick dem Referenzhandbuch bald hinzufügen.

Anfrage auf Anfrage: https://github.com/spring-projects/spring-integration/pull/2015

+0

Hallo! Dies funktionierte fast, außer dass ich fand, dass ich 'DelegatingSecurityContextAsyncTaskExecutor' ableiten musste, da es die' AsyncListenableTaskExecutor'-Schnittstelle nicht implementierte. Sollte ich eine Änderungsanfrage mit dem Spring Security Team stellen, um es zu ändern, um den AsyncListenableTaskExecutor zu implementieren? –

+0

Ja, bitte: https://github.com/spring-projects/spring-security/issues. –

Verwandte Themen