【发布时间】:2016-05-31 05:11:11
【问题描述】:
我是 Zuul 作为边缘服务器。所以所有请求都通过这个边缘服务器。 我有一个微服务 A。A 的所有 Web 服务都受基本身份验证的保护。 怎么调用 Zuul 代理传递的 A b 的服务呢? 我应该为消息添加标题吗?
【问题讨论】:
标签: spring-security spring-cloud netflix-zuul
我是 Zuul 作为边缘服务器。所以所有请求都通过这个边缘服务器。 我有一个微服务 A。A 的所有 Web 服务都受基本身份验证的保护。 怎么调用 Zuul 代理传递的 A b 的服务呢? 我应该为消息添加标题吗?
【问题讨论】:
标签: spring-security spring-cloud netflix-zuul
这个变化有点棘手。
@Override
public int filterOrder() {
return 1; // change the return value to more than 5 the above code will work.
}
试试下面的最终代码:
@Component
public class PreFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(PreFilter.class);
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 10;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
HttpServletRequest request = ctx.getRequest();
ctx.addZuulRequestHeader("Authorization", request.getHeader("Authorization"));
return null;
}
}
【讨论】:
使用zuul的敏感头属性与空白值,
zuul.sensitiveHeaders=
以上属性可以解决问题,但如果您想为 Cookie 标头设置过滤器 您可以将该属性与值一起使用,
zuul.sensitiveHeaders=Cookie,Set-Cookie
【讨论】:
您可以像这样调用(通过 Zuul)您的服务 A:
https://login:password@zuulurl.com/serviceA
但首先允许通过 Zuul 使用属性文件中的属性 sensitiveHeaders 的特定服务(路由)的 AUTHORIZATION 标头:
zuul.routes.serviceA.sensitiveHeaders=Cookie,Set-Cookie
如果您也想传递 Cookie 标头,也可以将其留空。
这里有更多关于headers through Zuul的信息
【讨论】:
@Component
public class PreFilter extends ZuulFilter {
private static final Logger LOG = LoggerFactory.getLogger(PreFilter.class);
@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();
HttpServletRequest request = ctx.getRequest();
ctx.addZuulRequestHeader("Authorization", request.getHeader("Authorization"));
LOG.info("Parametres : {}", request.getParameterMap()
.entrySet()
.stream()
.map(e -> e.getKey() + "=" + Stream.of(e.getValue()).collect(Collectors.toList()))
.collect(Collectors.toList()));
LOG.info("Headers : {}", "Authorization" + "=" + request.getHeader("Authorization"));
LOG.info(String.format("%s request to %s", request.getMethod(), request.getRequestURL().toString()));
return null;
}
}
【讨论】:
这是我的 Zuul 过滤器:
public class BasicAuthorizationHeaderFilter extends ZuulFilter {
@Override
public String filterType() {
return "pre";
}
@Override
public int filterOrder() {
return 10;
}
@Override
public boolean shouldFilter() {
return true;
}
@Override
public Object run() {
RequestContext ctx = RequestContext.getCurrentContext();
ctx.getRequest().getRequestURL();
ctx.addZuulRequestHeader("Authorization", "Basic " + Utils.getBase64Credentials("user", "Token"));
return null;
}
}
【讨论】:
理想情况下,请求者会在请求中拥有令牌。
如果你想让 Zuul 添加身份验证令牌,那么你可以创建一个 ZuulFilter 并使用:
context.addZuulRequestHeader("Authorization", "base64encodedTokenHere");
这样做会开放访问服务 - 这可能不明智。
【讨论】: