9

スプリング ブート アプリを実行していて、spring-cloud-netflix から Hystrix を統合し始めたところです。@HystrixCommand を使用して、偽のクライアントで行われたサービス間の呼び出しをラップしています。

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

この偽のクライアントは、Spring セキュリティ コンテキストを使用して、作成するリクエストにセキュリティ ヘッダーを追加します。

私が抱えている問題は、HystrixCommand が実行されると、Hystrix スレッド プールとは別のスレッドで実行され、コードがスプリング セキュリティ コンテキストにアクセスしようとすると、新しいスレッドでは利用できないことです。

私は次のように春のセキュリティコンテキストにアクセスしています:

SecurityContextHolder.getContext().getAuthentication();

私の質問は、Spring は、Spring セキュリティ コンテキスト (およびアプリケーション コンテキスト) を Hystrix コマンドを実行している Hystrix スレッドに渡す方法を提供しますか?

4

4 に答える 4

4

ApplicationContext通常の方法で Beanを取得できるはずです。認証オブジェクトを渡す方法は 2 つあります。1) メソッドへのパラメーターとして、または 2)別のスレッドではなく、セマフォ分離を使用して hystrix を実行します。

@HystrixCommand(fallbackMethod = "updateThingFallback", commandProperties = {
        @HystrixProperty(name = "execution.isolation.strategy", value = "SEMAPHORE")
})
于 2015-05-04T15:42:34.517 に答える
1

または、Hystrix が使用する Executor を DelegatingSecurityContextExecutor でラップすることもできます。

https://docs.spring.io/spring-security/site/docs/current/reference/htmlsingle/#delegatingsecuritycontextexecutorを参照してください。

于 2016-05-27T21:49:50.347 に答える