2015-04-10 5 views
5

Я запускаю приложение для загрузки весны и только начинаю интегрировать Hystrix из spring-cloud-netflix. Я использую @HystrixCommand для переноса вызова службы на обслуживание, созданного с помощью фальшивого клиента.Имеет ли Spring значение SecurityContext для потока, выполняющего команду Hystrix

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

Этот клиент feign использует контекст безопасности весов, чтобы добавить заголовки безопасности в запрос, который он делает.

Проблема, с которой я столкнулся, заключается в том, что при выполнении HystrixCommand она запускается в отдельном потоке из пула потоков Hystrix и когда мой код пытается получить доступ к контексту безопасности пружины, он недоступен в новом потоке.

Я доступ к контексту пружинной безопасности, как это:

SecurityContextHolder.getContext().getAuthentication(); 

Моему вопрос, это весна обеспечивает способ передачи контекста пружины безопасности (и контекст приложения) к нитям Hystrix, которые работают команды Hystrix?

ответ

3

Вы должны иметь возможность получить ApplicationContext в своем компоненте обычными средствами. Я могу увидеть два способа передачи объекта аутентификации: 1) как параметр для вашего метода или 2) запустить hystrix с Semaphore isolation, а не в отдельном потоке.

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

Спасибо , это работает, НО, если я правильно понимаю 'SEMAPHORE' против' THREAD', то место, с которым у меня возникли проблемы, было бы идеальным для THREAD: сетевой вызов удаленный сервис, который в лучшие времена не очень быстрый, и слишком часто полностью бомбит. Поэтому я предполагаю, что мой лучший вариант - немного переработать код, чтобы передать auth как параметр? – demaniak

2

Я решил это с: solution example Но этот пример для весенне-загрузки приложения, я applie это в Tomcat 7 два основных изменения был:

  1. Фильтр созданный в web.xml.
  2. В INIT из: "класса HystrixRequestContextEnablerFilter" Я добавил: `

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

Ссылка очень хорошая, спасибо. – vegemite4me

3

С Spring Cloud Netflix 1.2.0 вы можете включить общий доступ контекста безопасности с Hystrix используя конфигурационный Param

hystrix.shareSecurityContext: true