我正在尝试在一个简单的Spring Cloud Netflix API网关(反向代理)中使用Zuul过滤器,以便通过Rest调用对自定义身份验证提供程序进行身份验证。
此过滤器应该拒绝未经授权的请求并将那些请求阻止传递到代理服务。
这对于Zuul过滤器来说是否可能?我没有在Zuul的API中找到文档、示例或类似的东西。
有任何建议吗?
我正在尝试在一个简单的Spring Cloud Netflix API网关(反向代理)中使用Zuul过滤器,以便通过Rest调用对自定义身份验证提供程序进行身份验证。
此过滤器应该拒绝未经授权的请求并将那些请求阻止传递到代理服务。
这对于Zuul过滤器来说是否可能?我没有在Zuul的API中找到文档、示例或类似的东西。
有任何建议吗?
我设法让这个工作了,花了一些时间。 确保您的请求尚未被缓存。 只需从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);
}
}
我使用一个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
ctx.getResponse().sendError(code)
而不是ctx.setResponseStatusCode(code)
和ctx.setResponseBody(body);
允许Spring框架处理错误。 - Vijay Aggarwal