Zuul -> Eureka Server,基本身份验证问题

Posted

技术标签:

【中文标题】Zuul -> Eureka Server,基本身份验证问题【英文标题】:Zuul -> Eureka Server, Basic Authentication issue 【发布时间】:2016-12-30 09:20:06 【问题描述】:

如果流程不包含基本授权,我可以访问服务。

如果我使用基本授权,它会抛出“消息”:“访问此资源需要完全身份验证”

以下是我的观察:

在 ZuulFilter 的 run() 方法中,我得到了 request.getHeader("Authorization") --> 基本 c29tOnNvbzz==

但是一旦它到达微服务,我得到的价值是'null', request.getHeader("授权") --> null

使用 Spring Boot 版本:1.4.0.RELEASE

This is my flow:
------------------

Zuul -> Service Discovery (Eureka Server) -> Service

请帮忙,不确定授权标头在哪里消失。

Eureka Server yml file:
-------------------------
server.port:4001
eureka.instance.hostname=localhost
eureka.client.fetch-registry:false
eureka.client.register-with-eureka:false
eureka.client.serviceUrl.defaultZone: http://$eureka.instance.hostname:$server.port/eureka/
eureka.client.healthcheck.enabled=true

Zuul yml file:
-----------------
server:
  port: 8765
info:
  component: Edge Server
eureka:
  instance:
    leaseRenewalIntervalInSeconds: 3
    metadataMap:
      instanceId: $spring.application.name:$random.value
  client:
    # Default values comes from org.springframework.cloud.netflix.eurek.EurekaClientConfigBean
    registryFetchIntervalSeconds: 5
    instanceInfoReplicationIntervalSeconds: 5
    initialInstanceInfoReplicationIntervalSeconds: 5

endpoints:
  restart:
    enabled: true
  shutdown:
    enabled: true
  health:
    sensitive: false

zuul.sensitive-headers: Cookie,Set-Cookie,Authorization

logging:
  level:
    ROOT: WARN
    se.callista: INFO

    # Get info regarding connection to the cofig server and retries if required
    org.springframework.cloud.config.client.ConfigServicePropertySourceLocator: INFO
    org.springframework.retry.support.RetryTemplate: DEBUG

    # Set INFO to see the allocated port
    org.springframework.boot.context.embedded.tomcat.TomcatEmbeddedServletContainer: INFO
---
eureka:
  instance:
    preferIpAddress: true
  client:
    serviceUrl:
      defaultZone: http://localhost:4001/eureka,http://localhost:4002/eureka

【问题讨论】:

【参考方案1】:

Authorization 默认是一个敏感的 header,这意味着 Zuul 不会转发它们。如果你把它排除在敏感的标头之外,Zuul 会转发标头。

zuul.sensitiveHeaders: Cookie,Set-Cookie

它也应该是驼峰式而不是连字符。

额外信息:https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#cookies-and-sensitive-headers

【讨论】:

【参考方案2】:

您的zuul.sensitiveHeaders 属性错误。它是驼峰式,没有连字符。

https://github.com/spring-cloud/spring-cloud-netflix/blob/master/docs/src/main/asciidoc/spring-cloud-netflix.adoc#cookies-and-sensitive-headers

【讨论】:

【参考方案3】:

这解决了我的问题,但这是我们唯一的解决方案吗?

ctx.addZuulRequestHeader("Authorization",request.getHeader("‌​Authorization"))

【讨论】:

以上是关于Zuul -> Eureka Server,基本身份验证问题的主要内容,如果未能解决你的问题,请参考以下文章

Eureka+Feign+Ribbon+Zuul+Hystrix+Config+Bus构建一套SpringCloud项目

Zuul入门

Eureka Server集群版搭建

SpringCloud2.0 Zuul 网关路由 基础教程

Spring Cloud之搭建动态Zuul网关路由转发

如何Spring Cloud Zuul作为网关的分布式系统中整合Swagger文档在同一个页面上