7

私はSpringブートzuulとeurekaサービスを使用してマイクロサービスを設定しました。 すべてのルート/ REST API呼び出しを認証する必要があります。 私は、すべてのAPIクライアントが1つのaccessTokenを送信することを意味します。 zuulサービスでは、特定のサービスにルーティングする前に、accessTokenを使用してマイクロサービス(auth-service)を呼び出す必要があり、auth-serviceはaccessTokenが送信されたことをユーザーに確認します。 accessTokenが有効な場合、ルーティングのみが実行されます。SpringブートZuulサービスルートにアクセスするための認証

私は春のブートサービスを使用して実装するのを助けてください。

ありがとうございました。

+0

は、あなたが信頼できる署名トークンあなたのaccessTokenはありませんか? –

+0

spring-securityはこれを適切に行う方法です。呼び出し元がプロキシを回り、マイクロサービスに直接アクセスできる方法がないことがわかっている場合にのみ、これを行う必要があります。 –

+0

@Andy Brown、詳細を確認したり、確認するリンクを教えてください。 – Krish

答えて

3

フィルタを作成する必要があります。 A preは必要なものです。フィルター内で認証サーバーにアクセスできます。トークンが無効な場合は、マイクロサービスを呼び出してすぐに応答を返しません。有効な場合は、リクエストをマイクロサービスに送信します。

例のフィルタクラス:

public class AuthFilter extends ZuulFilter { 

    @Autowired 
    RestTemplate restTemplate; 

    @Override 
    public String filterType() { 
     return "pre"; 
    } 

    @Override 
    public int filterOrder() { 
     return 1; 
    } 

    @Override 
    public boolean shouldFilter() { 
     return true; 
    } 

    @Override 
    public Object run() { 
     RequestContext ctx = RequestContext.getCurrentContext(); 
     //get your token from request context and send it to auth service via rest template 
     boolean validToken = restTemplate.exchange(or getForObject or other methods of restTemplate which you find suitable for method and return type of your auth service controller method) 
     if(!validToken) { 
      ctx.setSendZuulResponse(false); //This makes request not forwarding to micro services 
      ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value()); 
      ValidationResponse validationResponse = new ValidationResponse(); 
      validationResponse.setSuccess(false); 
      validationResponse.setMessage("Invalid Access..."); 
      ObjectMapper mapper = new ObjectMapper(); 
      String responseBody = mapper.writeValueAsString(validationResponse); 
      ctx.setResponseBody(validationResponse); 
      ctx.getResponse().setContentType("application/json"); 
      //If you want to do any thing else like logging etc, you can do it. 
     } 
     return null; 
    } 

} 
+0

お返事ありがとうございます。 文字列としてレスポンスを設定できます。 ctx.setResponseBody( "無効なアクセス...!"); Response BodyをValidationResponseのようなカスタムオブジェクトとして設定する必要があります。 ValidationResponseは、すべてのサービスの独自の応答オブジェクトです。 次のようなもの: validationResponse.setSuccess(false); validationResponse.setMessage( "無効なアクセス..."); このvalidationResponseを応答オブジェクトとして設定します。 これで助けてもらえますか? – Krish

+0

@Krishna、問題はありません。ただrequestContext responseBodyを設定する必要があります。 – barbakini

+0

いいえ、com.netflix.zuul.context.RequestContext.setResponseBody()はStringデータ型のみをサポートしています。(xmlを使用すると、コンテンツタイプをjsonに設定しました。 – Krish

関連する問題