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

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

谢谢。

请您参考如下方法:

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

一个示例过滤器类:

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


评论关闭
IT干货网

微信公众号号:IT虾米 (左侧二维码扫一扫)欢迎添加!