代码之家  ›  专栏  ›  技术社区  ›  Krish

访问Spring boot Zuul服务路由的身份验证

  •  7
  • Krish  · 技术社区  · 7 年前

    我的意思是,对于所有API,客户端发送一个accessToken。 在zuul服务上,在路由到特定服务之前,我必须使用accessToken调用微服务(auth服务),并且auth服务将检查用户是否存在发送的accessToken。

    请帮助我使用spring引导服务来实现这一点。

    谢谢

    1 回复  |  直到 7 年前
        1
  •  7
  •   barbakini    7 年前

    你需要写一个过滤器。阿祖尔 过滤器是您需要的。您可以在过滤器中访问您的身份验证服务器,如果令牌无效,您不会调用您的微服务并立即返回响应。如果它是有效的,你就让请求转到微服务。

    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;
        }
    
    }