2015-04-10 14 views
5

Sto eseguendo un'applicazione di avvio a molla e sto iniziando a integrare Hystrix da spring-cloud-netflix. Sto usando @HystrixCommand per racchiudere una chiamata service-to-service fatta con un client fittizio.Spring rende disponibile SecurityContext per il thread che esegue un comando Hystrix

@HystrixCommand(fallbackMethod = "updateThingFallback") 
def updateRemoteThing(thingResourceClient: ThingResourceClient, thing: Thing) { 
    thingResourceClient.updateThing(thing) // Call using feign client 
} 

Questo finto client utilizza il contesto di sicurezza molla per aggiungere intestazioni di sicurezza alla richiesta che effettua.

Il problema che si verifica è che quando viene eseguito HystrixCommand viene eseguito in un thread separato da un pool di thread Hystrix e quando il mio codice tenta di accedere al contesto di sicurezza Spring non è disponibile sul nuovo thread.

Sto accedendo al contesto di protezione primavera come questo:

SecurityContextHolder.getContext().getAuthentication(); 

La mia domanda è, non molla fornisce un modo di passare il contesto di sicurezza a molla (e il contesto dell'applicazione) per i fili Hystrix che eseguono i comandi Hystrix?

risposta

3

Si dovrebbe essere in grado di ottenere il ApplicationContext nel proprio bean con i mezzi normali. Posso vedere due modi per passare l'oggetto di autenticazione: 1) come parametro per il tuo metodo, oppure 2) eseguire hystrix con Semaphore isolation piuttosto che su un thread separato.

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

Grazie , questo funziona, MA se capisco correttamente 'SEMAPHORE' vs' THREAD', il punto in cui sto avendo problemi sarebbe stato ideale per THREAD: una chiamata di rete ad un servizio remoto, che nel migliore dei casi non è molto veloce e troppo spesso bombarda completamente. Quindi immagino che la mia migliore opzione sia di rielaborare il codice un po 'per passare l'auth come parametro? – demaniak

2

ho risolto questo con: solution example Ma questo esempio è per un'applicazione primavera-boot, ho applie questo in un Tomcat 7 le due modifiche principali era:

  1. il filtro è stato creato nel web.xml.
  2. Nella init di: "Classe HystrixRequestContextEnablerFilter" ho aggiunto: `

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

Il collegamento è un'ottima lettura, grazie. – vegemite4me

3

Dal Spring Cloud Netflix 1.2.0 è possibile attivare la condivisione di contesto di sicurezza con Hystrix utilizzando config param

hystrix.shareSecurityContext: true

Problemi correlati