9

偽のクライアント RequestInterceptor を使用してリクエスト ヘッダーを転送したいのですが、 内RequestInterceptor.applyRequestContextHolder.getRequestAttributes()null、 is ですSecurityContextHolder.getContext().getAuthentication()(最終的にはヘッダーの値を取得することもできます)。

これは、Spring-Cloud Brixton にアップグレードする前に機能していました。次のパラメーターに変更すると問題が解決するため、hystrix コマンドをおそらく別のスレッドで実行する必要があります。

hystrix.command.default.execution.isolation.strategy: SEMAPHORE

さて、必要がなければ、この種のデフォルト値を変更することにあまり熱心ではありません。現在、ヘッダーを転送する別の推奨される方法はありますか?

ありがとう

4

2 に答える 2

7

Spring Boot 2+ / Spring Cloud Finchley + の場合、セキュリティ コンテキストのみが必要な場合は、次のプロパティを設定できます。

hystrix.shareSecurityContext=true

そして、リクエストインターセプターが機能するはずです。


他のユースケースまたは以前のバージョンの場合 ( Spring Cloud Sleuthのインスピレーションに感謝します):

あなたがしなければならないHystrixConcurrencyStrategyことは、スレッドが変更されるたびに情報を渡す を実装することだけです。Sleuth で非常によく似た処理を行うクラスがここにあります。

私の特定のケースでは、次のことを行います。

  1. たとえば、構築時に現在の認証を保持するクラスでラップしますCallablewrapCallableCallableWithAuthentication
  2. このCallableWithAuthentication callメソッドは、最初に以前に保存した を復元しAuthentication、次に元のアクションを呼び出し、次に現在の をクリーンアップしAuthenticationます。

一度あなたHystrixConcurrencyStrategyの要求インターセプターは、たとえスレッド分離を使っていても、再び動作します。

プロジェクトの残りの部分を確認してください。他にも興味深い計測機能がたくさんあります (たとえば、RxJava の場合)。

于 2016-06-30T14:31:34.300 に答える