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