SpringCloud consul 微服務(註冊到主機名的問題)- SpringSecurityOAuth2 authorization_code 模式遇到的坑

目前項目在使用consul作服務註冊與發現,作SpringSecurityOAuth2 權限認證的authorization_code模式的時候發現一個異常坑爹的問題java

這是開始的服務註冊代碼塊 bootstrap.yml:git

spring:
  cloud:
    consul:
      port: 8500
      host: localhost
      discovery:
        serviceName: auth
        locator:
          lower-case-service-id: true
          enabled: true
        register: true

這是註冊完後的健康檢查github

他會把你的主機地址給註冊上來。 平時使用可能沒問題,可是 當作OAuth2的 authorization_code 模式認證的時候,會出現跨域異常狀況以下:spring

這是請求路徑:bootstrap

http://localhost:8001/auth/oauth/authorize?response_type=code&client_id=client_name&redirect_uri=http://localhost:8001/auth/callback&scope=auth跨域

訪問後跳轉到默認的登陸界面:app

仔細看,url位置訪問地址變成了以前註冊的主機名 從而致使的結果就是,點擊登陸界面出現下圖: 微服務

沒有權限 返回401。 問題就出在了,跳轉回主機名致使了跨域問題。url

解決該問題的措施就是修改開始的bootstrap.yml的文件:3d

spring:
  cloud:
    consul:
      port: 8500
      host: localhost
      discovery:
        serviceName: auth
        locator:
          lower-case-service-id: true
          enabled: true
        register: true
        prefer-ip-address: true #這個必須配
        tags: version=1.0
        instance-id: ${spring.application.name}:${spring.cloud.client.ip-address}
        healthCheckInterval: 15s
        health-check-url: http://${spring.cloud.client.ip-address}:${server.port}/actuator/health

consul註冊增長強制限制 prefer-ip-address:true 強制獲取ip的方式註冊到consul。

2019.07.09

因爲沒有配置

spring.cloud.consul.discovery.prefer-ip-address=true

微服務將會註冊所在主機/容器的主機名 註冊到consul,然而,咱們會發現有時可能形成註冊IP到consul  主機名是經過調用Java API獲取的,有時候Java API沒法得到主機名,因而會將IP地址發送給 consul + 只要你配置了環境變量HOST_NAME ,就能夠將你所配置的環境變量註冊

spring.cloud.gateway.discovery.instance.hostname=${HOST_NAME}

獲取主機名的相關代碼:

https://github.com/spring-cloud/spring-cloud-commons/blob/master/spring-cloud-commons/src/main/java/org/springframework/cloud/commons/util/InetUtils.java

相關Issue

https://github.com/spring-cloud/spring-cloud-netflix/issues/2084

從ip跳轉回主機名致使跨域權限異常。

相關文章
相關標籤/搜索