背景
我想实现本 article 中提出的设计.
可以用下图来概括:
我到目前为止所拥有的
我已经完成了大部分工作:
我还编写了一个 Zuul PRE 过滤器,用于检查访问 token 、联系 IDP 并创建 JWT。然后将 JWT 添加到转发到下游服务的请求的 header 中。
问题
现在我的问题是针对 Zuul 及其过滤器的。如果由于任何原因在 API 网关中身份验证失败,我如何才能停止路由并直接使用 401 响应,而无需继续过滤器链并转发调用?
目前,如果身份验证失败,过滤器不会将 JWT 添加到 header 中,并且 401 将来自下游服务。我希望我的网关可以防止这种不必要的调用。
我试着看看如何使用
com.netflix.zuul.context.RequestContext
这样做,但文档很差,我找不到办法。
请您参考如下方法:
我知道我很晚才回答。
您可以使用zuul的前置过滤器。下面给出了您必须遵循的步骤。
//1. create filter with type pre
//2. Set the order of filter to greater than 5 because we need to run our filter after preDecoration filter of zuul.
@Component
public class CustomPreZuulFilter extends ZuulFilter {
private final Logger logger = LoggerFactory.getLogger(this.getClass());
@Override
public Object run() {
final RequestContext requestContext = RequestContext.getCurrentContext();
logger.info("in zuul filter " + requestContext.getRequest().getRequestURI());
byte[] encoded;
try {
encoded = Base64.encode("fooClientIdPassword:secret".getBytes("UTF-8"));
requestContext.addZuulRequestHeader("Authorization", "Basic " + new String(encoded));
final HttpServletRequest req = requestContext.getRequest();
if (requestContext.getRequest().getHeader("Authorization") == null
&& !req.getContextPath().contains("login")) {
requestContext.unset();
requestContext.setResponseStatusCode(HttpStatus.UNAUTHORIZED.value());
} else {
//next logic
}
}
} catch (final UnsupportedEncodingException e) {
logger.error("Error occured in pre filter", e);
}
return null;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public int filterOrder() {
return 6;
}
@Override
public String filterType() {
return "pre";
}
}
requestContext.unset() 将为当前线程事件请求重置 RequestContext,您可以提供响应状态代码。