6

この spring.io の優れたガイドで説明されているものと非常によく似たアーキテクチャを使用しています。私たちのゲートウェイは認証を処理し、セッションは spring-session を使用して Redis に保存されます。マイクロ サービスのエンドポイントはセキュリティで保護されており、スプリング セッションも使用します。

マイクロ サービスでは、別のマイクロ サービスのエンドポイントを呼び出す必要があります。ディスカバリ クライアントを介して URL を簡単に取得できますが、資格情報を提供する必要があり、それを実現する最善の方法がわかりません。

HttpRequest から SESSION Cookie を取得し、それをある種のスレッド ローカル変数またはリクエスト スコープ Bean に格納し、それを RestTemplate で使用して 2 番目のマイクロ サービスを呼び出すことを考えています。RestTemplate は MVC コントローラーではなくサービス層で使用されるため、このリクエスト スコープ Bean が必要です。Cookie から取得したこのセッション識別子でサービス層メソッドを汚染したくないからです。

このニーズにアプローチするより良い方法はありますか? これに対するSpring Cloudのサポートはすでにありますか?

ご意見をお寄せいただきありがとうございます

4

2 に答える 2

5

現時点で、Spring セッション ID にアクセスする最も簡単な方法は、RequestContextHolder.getRequestAttributes().getId(). アクセスできるようになったらClientHttpRequestInterceptor、セッション ID をリクエストに含めるカスタムを作成できます。

public SpringSessionClientHttpRequestInterceptor implements ClientHttpRequestInterceptor {
    public ClientHttpResponse intercept(HttpRequest request, byte[] body, ClientHttpRequestExecution execution)
            throws IOException {
        boolean isMyService = ...;

        // very important not to send the session id to external services
        if(isMyService) {
            request.getHeaders().add("x-auth-token", RequestContextHolder.getRequestAttributes().getId());
        }
    }
}

次に、RestTemplate を作成するときに、必ずSpringSessionClientHttpRequestInterceptor.

RestTemplate rest = new RestTemplate();
rest.getInterceptors().add(new SpringSessionClientHttpRequestInterceptor());
于 2015-08-10T15:43:48.360 に答える