7

我已經使用Spring引導zuul和尤里卡服務配置了我的微服務。 現在我需要驗證所有路由/ REST API調用。 我的意思是,對於所有API客戶端發送一個accessToken。 在zuul服務上,在路由到特定服務之前,我必須使用accessToken調用微服務(auth-service),並且auth-service將檢查用戶是否存在發送的accessToken。 如果accessToken有效,那麼只有路由應該發生。身份驗證訪問Spring引導Zuul服務路線

請幫我使用spring啓動服務來實現這個。

謝謝。

+0

是不是你的accessToken一個簽名令牌可以信任? –

+0

彈簧安全是正確做到這一點的方法。如果您知道調用方無法繞過代理並直接訪問微服務,則只能這樣做。 –

+0

@安迪布朗,能否請您詳細提供一些鏈接或進行檢查? – Krish

回答

3

您需要編寫一個過濾器。一個zuul pre過濾器是你需要的。您可以在過濾器中訪問您的auth服務器,如果令牌無效,則不要調用您的微服務並立即返回響應。如果它是有效的,則讓請求轉到微服務。

一個例子過濾器類:

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(「Invalid Access ...!」); 我需要將Response Body設置爲像ValidationResponse這樣的自定義對象。 ValidationResponse是我對所有服務的唯一響應對象。 類似如下: validationResponse.setSuccess(false); validationResponse.setMessage(「Invalid Access ...」); 然後將此validationResponse設置爲響應對象。 你能幫忙嗎? – Krish

+0

@克里希納,沒問題,你只需要設置requestContext responseBody。我更新了答案(我將內容類型設置爲json,如果使用xml,則可以相應地設置內容類型) – barbakini

+0

不,com.netflix.zuul.context.RequestContext.setResponseBody()僅支持String數據類型。 – Krish