2015-04-10 4 views
5

Ich starte eine Spring-Boot-App und beginne gerade, Hystrix von spring-cloud-netflix zu integrieren. Ich verwende @HystrixCommand, um einen Service-to-Service-Anruf mit einem falschen Client zu umbrechen.Stellt Spring den SecurityContext für den Thread zur Verfügung, der einen Hystrix-Befehl ausführt

Dieser Schein-Client verwendet den Spring-Sicherheitskontext, um Sicherheitsanforderungen zu der Anforderung hinzuzufügen.

Das Problem, das ich habe, ist, dass, wenn der HystrixCommand ausgeführt wird, es in einem separaten Thread von einem Hystrix-Thread-Pool ausgeführt wird und wenn mein Code versucht, auf den Spring-Sicherheitskontext zuzugreifen, ist es nicht auf dem neuen Thread verfügbar.

ich den Zugriff auf den Frühling Sicherheitskontext wie folgt aus:

SecurityContextHolder.getContext().getAuthentication(); 

Meine Frage ist, ob Frühling bieten eine Möglichkeit, die Federsicherheitskontext (und den Anwendungskontext) zu den Hystrix Fäden vorbei, die ausgeführt werden die Hystrix-Befehle?

Antwort

3

Sie sollten in der Lage sein, die ApplicationContext in Ihrer Bohne mit den normalen Mitteln zu erhalten. Ich kann zwei Möglichkeiten sehen, das Authentifizierungsobjekt zu übergeben: 1) als Parameter für Ihre Methode, oder 2) führen Sie hystrix mit Semaphore isolation statt auf einem separaten Thread.

@HystrixCommand(fallbackMethod = "updateThingFallback", commandProperties = { 
     @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE") 
}) 
+0

Dank Verwendung , das funktioniert, ABER wenn ich 'SEMAPHORE' vs.' THREAD' richtig verstehe, wäre die Stelle, an der ich Probleme habe, ideal für THREAD gewesen: ein Netzwerkanruf an eine Remote-Service, der in den besten Zeiten nicht sehr schnell ist, und zu oft völlig bombardiert. Ich denke also, meine beste Option ist, den Code ein wenig zu überarbeiten, um die Auth als Param zu übergeben? – demaniak

2

ich beschlossen dies mit: solution example Aber dieses Beispiel ist für eine Feder-Boot-App, Applie ich diese in einem Tomcat 7 sind die beiden wichtigsten Änderungen war:

  1. Der Filter wurde erstellt in der web.xml.
  2. Im init von: "Klasse HystrixRequestContextEnablerFilter" Ich fügte hinzu: `

    @Override 
         public void init(FilterConfig filterConfig) throws ServletException { 
          HystrixPlugins.getInstance().registerCommandExecutionHook(new SecurityContextRegistratorCommandHook()); 
    } 
    
+0

Der Link ist eine sehr gute Lektüre, danke. – vegemite4me

3

Seit Spring Cloud Netflix 1.2.0 Sie die Freigabe von Sicherheitskontext mit Hystrix aktivieren Config param

hystrix.shareSecurityContext: true

Verwandte Themen