Zuul 调用的基本身份验证服务
Basic Authentication service called By Zuul
我是 Zuul 作为边缘服务器。所以所有请求都通过这个边缘服务器。
我有一个 micro-service A,A 的所有 Web 服务都受 Basic Authentication 保护。
怎么通过Zuul代理调用A b的服务呢?
我应该为消息添加 header 吗?
理想情况下,请求者会在请求中包含令牌。
如果你想让 Zuul 添加身份验证令牌,那么你可以创建一个 ZuulFilter 并使用:
context.addZuulRequestHeader("Authorization", "base64encodedTokenHere");
这样做会开放对服务的访问——这可能并不明智。
这是我的 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;
}
}
@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)你的服务 A :
https://login:password@zuulurl.com/serviceA
但首先允许 AUTHORIZATION header 通过 Zuul 使用 属性 sensitiveHeaders 在您的属性文件中:
zuul.routes.serviceA.sensitiveHeaders=Cookie,Set-Cookie
如果您也想传递 Cookie header,请将其清空。
这里有更多关于headers through Zuul
的信息
使用zuul的敏感header 属性带空白值,
zuul.sensitiveHeaders=
以上 属性 就可以了,但是如果你想为 Cookie header 设置过滤器
您可以将 属性 与值一起使用,
zuul.sensitiveHeaders=Cookie,Set-Cookie
这个改动有点棘手。
@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 作为边缘服务器。所以所有请求都通过这个边缘服务器。 我有一个 micro-service A,A 的所有 Web 服务都受 Basic Authentication 保护。 怎么通过Zuul代理调用A b的服务呢? 我应该为消息添加 header 吗?
理想情况下,请求者会在请求中包含令牌。
如果你想让 Zuul 添加身份验证令牌,那么你可以创建一个 ZuulFilter 并使用:
context.addZuulRequestHeader("Authorization", "base64encodedTokenHere");
这样做会开放对服务的访问——这可能并不明智。
这是我的 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;
}
}
@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)你的服务 A :
https://login:password@zuulurl.com/serviceA
但首先允许 AUTHORIZATION header 通过 Zuul 使用 属性 sensitiveHeaders 在您的属性文件中:
zuul.routes.serviceA.sensitiveHeaders=Cookie,Set-Cookie
如果您也想传递 Cookie header,请将其清空。
这里有更多关于headers through Zuul
的信息使用zuul的敏感header 属性带空白值,
zuul.sensitiveHeaders=
以上 属性 就可以了,但是如果你想为 Cookie header 设置过滤器 您可以将 属性 与值一起使用,
zuul.sensitiveHeaders=Cookie,Set-Cookie
这个改动有点棘手。
@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;
}
}