用于访问Spring引导Zuul服务路由的身份验证

时间:2017-08-04 15:47:31

标签: spring-mvc spring-boot microservices netflix-eureka netflix-zuul

我使用Spring boot zuul和eureka服务配置了我的微服务。 现在我需要验证所有路由/ REST API调用。 我的意思是,对于所有API客户端发送一个accessToken。 在zuul服务上,在路由到特定服务之前,我必须使用accessToken调用微服务(auth-service),并且auth-service将检查用户是否存在以便发送accessToken。 如果accessToken有效,那么只应该进行路由。

请帮我用Spring Boot服务实现这个。

感谢。

1 个答案:

答案 0 :(得分:4)

您需要编写过滤器。您需要一个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;
    }

}