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;
    }
}