【问题标题】:Basic Authentication service called By ZuulZuul 调用的基本身份验证服务
【发布时间】:2016-05-31 05:11:11
【问题描述】:

我是 Zuul 作为边缘服务器。所以所有请求都通过这个边缘服务器。 我有一个微服务 A。A 的所有 Web 服务都受基本身份验证的保护。 怎么调用 Zuul 代理传递的 A b 的服务呢? 我应该为消息添加标题吗?

【问题讨论】:

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


    【解决方案1】:

    这个变化有点棘手。

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

    【讨论】:

      【解决方案2】:

      使用zuul的敏感头属性与空白值,

      zuul.sensitiveHeaders=
      

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

      zuul.sensitiveHeaders=Cookie,Set-Cookie
      

      【讨论】:

        【解决方案3】:

        您可以像这样调用(通过 Zuul)您的服务 A:

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

        但首先允许通过 Zuul 使用属性文件中的属性 sensitiveHeaders 的特定服务(路由)的 AUTHORIZATION 标头:

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

        如果您也想传递 Cookie 标头,也可以将其留空。

        这里有更多关于headers through Zuul的信息

        【讨论】:

          【解决方案4】:
          @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;
              }
          }
          

          【讨论】:

          • 请删除答案中不必要的代码并添加简短说明。
          【解决方案5】:

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

          【讨论】:

            【解决方案6】:

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

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

            这样做会开放访问服务 - 这可能不明智。

            【讨论】:

              猜你喜欢
              • 2016-12-30
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多