基本身份验证服务,名为By Zuul

时间:2016-02-18 20:16:33

标签: spring-security spring-cloud netflix-zuul

我是Zuul作为边缘服务器。所有请求都通过此边缘服务器传递。 我有一个微服务A.A的所有Web服务都受基本身份验证保护。 我们如何通过Zuul代理调用A b的服务? 我应该为邮件添加标题吗?

6 个答案:

答案 0 :(得分:8)

这是我的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;
}

}

答案 1 :(得分:6)

理想情况下,请求者会在请求中拥有令牌 如果你想让Zuul添加身份验证令牌,那么你可以创建一个ZuulFilter并使用:

context.addZuulRequestHeader("Authorization", "base64encodedTokenHere");

这样做可以提供对服务的开放访问 - 这可能并不明智。

答案 2 :(得分:1)

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

答案 3 :(得分:0)

您可以拨打(通过Zuul)您的服务A:

https://login:password@zuulurl.com/serviceA

但是,对于此特定服务(路线),您的属性文件中的属性 sensitiveHeaders ,则允许 AUTHORIZATION 标头通过Zuul:

zuul.routes.serviceA.sensitiveHeaders=Cookie,Set-Cookie

或者如果你想传递Cookie标题也让它为空。

此处有关于headers through Zuul

的更多信息

答案 4 :(得分:0)

将zuul的敏感标头属性与空白值一起使用

zuul.sensitiveHeaders=

上面的属性可以解决问题,但是如果您想为Cookie标头设置过滤器  您可以将该属性与值一起使用

zuul.sensitiveHeaders=Cookie,Set-Cookie

答案 5 :(得分:0)

此更改有点棘手。

public int filterOrder() {
    return 1; // change the return value to more than 5 the above code will work.
} ```

```Example code:
@Override
public int filterOrder() {
    return 10; // change to more that 5 the above code will work.
} 

尝试下面的最终代码

` @零件 公共类PreFilter扩展ZuulFilter {     私有静态最终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;
}

}`