【问题标题】:NetflixOSS Zuul Filter for rejecting requests用于拒绝请求的 NetflixOSS Zuul 过滤器
【发布时间】:2015-09-14 22:53:05
【问题描述】:

我正在尝试在简单的 spring-cloud-Netflix Api 网关(反向代理)中使用 ZuulFilter,以便针对自定义身份验证提供程序(通过 Rest 调用)对请求进行身份验证。

过滤器应该拒绝未经授权的 401 请求,并且不要将这些请求进一步传递给代理服务。

这对 ZuulFilter 来说是否可行?我没有在 Zuuls api 中找到文档、示例或其他内容。

有什么建议吗?

【问题讨论】:

    标签: spring-cloud netflix netflix-zuul


    【解决方案1】:

    我得到了这个工作,进行了一些挖掘。确保您的请求尚未缓存。只需从 ZuulFilter 中的 run() 方法调用此方法即可。

    /**
     * Reports an error message given a response body and code.
     * 
     * @param body
     * @param code
     */
    private void setFailedRequest(String body, int code) {
        log.debug("Reporting error ({}): {}", code, body);
        RequestContext ctx = RequestContext.getCurrentContext();
        ctx.setResponseStatusCode(code);
        if (ctx.getResponseBody() == null) {
            ctx.setResponseBody(body);
            ctx.setSendZuulResponse(false);
        }
    }
    

    【讨论】:

    • 这行得通 - 一个简单的“ctx.setSendZuulResponse(false);”我们的代码中缺少 :)
    • @thomas-jäckle,假设您从预过滤器调用 auth-service,您如何获取主体?代码是什么?
    • 响应正文将为空,因为它还没有进行调用(预过滤器)。您实际上可以设置 ctx.setSendZuulResponse(false);完成您可能需要的事情。
    • 使用 ctx.getResponse().sendError(code) 而不是 ctx.setResponseStatusCode(code) 和 ctx.setResponseBody(body); 允许 Spring 框架处理我的错误。
    • 这对我帮助很大,我一直在寻找这个眼睛
    【解决方案2】:

    我使用pre 过滤器检查请求的身份验证,如果请求未授权,则返回401 并且不再调用后端服务。我在run() 函数中这样做:

    RequestContext ctx = getCurrentContext();
    // do something to check the authentication
    if(auth failed){
      ctx.unset();
      ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
    }
    

    ctx.unset()告诉上下文停止这个请求,ctx.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());设置http代码为401

    另见Netflix Zuul - block request routing

    【讨论】:

    • 执行 ctx.unset() 会使 Zuul 抛出异常。只需 ctx.setSendZuulResponse(false);为我工作。
    • ctx.unset() 用于使用 SpringBoot 1.x 和相关的 spring-cloud-netflix 依赖项
    【解决方案3】:

    如果您想在 Spring Cloud 中使用身份验证,请尝试 Spring Security Cloud 项目。

    【讨论】:

    • 是的,该项目有一些使用 oauth 的有用工具。 Zuul 基本上是一张白纸。 Spring Cloud Netflix Zuul 有一些简单的路由和转发功能。 Zuul 过滤器使您可以访问原始的 http 请求和响应,因此您可以做任何您需要的事情。请参阅我对这个问题的回答以开始使用:stackoverflow.com/questions/31055736/…
    猜你喜欢
    • 2014-02-23
    • 2018-12-28
    • 2021-01-01
    • 2016-07-10
    • 2012-06-07
    • 2017-06-13
    • 1970-01-01
    • 2014-02-10
    • 2015-09-30
    相关资源
    最近更新 更多