NetflixOSS Zuul过滤器用于拒绝请求。

19

我正在尝试在一个简单的Spring Cloud Netflix API网关(反向代理)中使用Zuul过滤器,以便通过Rest调用对自定义身份验证提供程序进行身份验证。

此过滤器应该拒绝未经授权的请求并将那些请求阻止传递到代理服务。

这对于Zuul过滤器来说是否可能?我没有在Zuul的API中找到文档、示例或类似的东西。

有任何建议吗?

3个回答

28

我设法让这个工作了,花了一些时间。 确保您的请求尚未被缓存。 只需从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);
    }
}

1
这个可行 - 我们的代码中缺少了一条简单的“ctx.setSendZuulResponse(false);”语句 :) - Thomas Jäckle
@thomas-jäckle,假设您从预过滤器调用auth-service,如何获取主体? 代码是什么? - Abhijit Sarkar
1
响应体将为空,因为它尚未进行调用(预过滤器)。您实际上只需设置ctx.setSendZuulResponse(false);即可完成您需要的操作。 - abeauchamp
在我的情况下,使用 ctx.getResponse().sendError(code) 而不是 ctx.setResponseStatusCode(code)ctx.setResponseBody(body); 允许Spring框架处理错误。 - Vijay Aggarwal
这对我帮助很大,我一直在寻找这个。 - kinsley kajiva

6

我使用一个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


2
执行ctx.unset()会导致Zuul抛出异常。只有ctx.setSendZuulResponse(false);对我有效。 - icordoba
1
ctx.unset() 用于与 SpringBoot 1.x 和相关的 spring-cloud-netflix 依赖项一起使用。 - Sam

2

是的,那个项目有一些有用的工具来使用oauth。Zuul基本上是一个空白的板子。Spring Cloud Netflix Zuul具有一些简单的路由和转发功能。Zuul过滤器使您可以访问原始的http请求和响应,因此您可以执行任何需要的操作。请参阅我对此问题的回答以开始:https://dev59.com/6Izda4cB1Zd3GeqPlVzP - spencergibb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接