spring-mvc - 访问 Spring Boot Zuul Service 路由的身份验证

标签 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 启动服务来实现这一点。

谢谢。

最佳答案

你需要写一个过滤器。阿祖尔过滤器就是你所需要的。您可以在过滤器中访问您的身份验证服务器,如果 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;
    }

}

关于spring-mvc - 访问 Spring Boot Zuul Service 路由的身份验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45510905/

相关文章:

duplicates - 微服务之间的数据重复——解决一个服务内的冗余

docker - 无法在远程Kubernetes中访问我的服务

java - Spring中的转换服务类

java - 将 Facebook 身份验证集成到 FacebookApp 中的 Spring Security

spring - 如何将 Spring Boot 应用程序作为服务运行?

java - Swagger OpenApi/看不到我的枚举属性

java - 尝试模拟 Elastic Search 的 RestHighLevelClient 时出现 NullPointerException 问题

spring-boot - netflix zuul服务器和netflix Eureka 服务器有什么区别?

mysql - Spring Petclinic (Spring Boot) 中的数据库连接问题

Java Spring,使用域对象