Spring boot Spring引导-无法通过Zuul代理获取KeyClope授权api的响应

Spring boot Spring引导-无法通过Zuul代理获取KeyClope授权api的响应,spring-boot,docker,keycloak,netflix-zuul,Spring Boot,Docker,Keycloak,Netflix Zuul,我在我的应用程序中使用SpringBoot微服务和docker。我已经通过Zuul代理公开了所有端点。我还使用keydepot保护我的api端点。我在application.properties文件中配置了它,如下所示。目前,我无法获得我的微服务api的响应,该api是使用keydove.securityConstraints授权的 请注意,我还将docker0的子网和网关更改为169.254.0.1/24和169.254.0.1。请查找我的申请的以下文件 docker compose.yml不

我在我的应用程序中使用SpringBoot微服务和docker。我已经通过Zuul代理公开了所有端点。我还使用keydepot保护我的api端点。我在
application.properties
文件中配置了它,如下所示。目前,我无法获得我的微服务api的响应,该api是使用
keydove.securityConstraints
授权的

请注意,我还将docker0的子网和网关更改为
169.254.0.1/24
169.254.0.1
。请查找我的申请的以下文件

docker compose.yml不指定子网

version: "3"
services:
    eureka-naming-server:
        image: eureka-naming-server
        ports:
            - "8761:8761"
        container_name: eureka-naming-server
    zuul-proxy-service:
        image: zuul-proxy-service
        ports:
            - "8765:8765"
        links:
            - eureka-naming-server
        container_name: zuul-proxy-service
    user-service:
        image: user-service
        ports:
            - "8082:8082"
        links:
            - eureka-naming-server
        container_name: user-service
    keycloak:
        image: jboss/keycloak
        container_name: keycloak
        environment:
            KEYCLOAK_USER: user
            KEYCLOAK_PASSWORD: user_password
        ports:
            - 8080:8080
具有指定默认子网的docker compose.yml

version: "3"
services:
    eureka-naming-server:
        image: eureka-naming-server
        ports:
            - "8761:8761"
        container_name: eureka-naming-server
    zuul-proxy-service:
        image: zuul-proxy-service
        ports:
            - "8765:8765"
        links:
            - eureka-naming-server
        container_name: zuul-proxy-service
    user-service:
        image: user-service
        ports:
            - "8082:8082"
        links:
            - eureka-naming-server
        container_name: user-service
    keycloak:
        image: jboss/keycloak
        container_name: keycloak
        environment:
            KEYCLOAK_USER: user
            KEYCLOAK_PASSWORD: user_password
        ports:
            - 8080:8080
networks:
    default:
        ipam:
            config:
                - subnet: "169.254.3.0/24"
Zull代理的application.yml

server:
  port: 8765

eureka:
  client:
    serviceUrl:
      defaultZone: http://eureka-naming-server:8761/eureka/
  instance:
    prefer-ip-address: true
    metadataMap:
      instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}}
    instanceId: ${vcap.application.instance_id:${spring.application.name}:${spring.application.instance_id:${random.value}}}

zuul:
  prefix: /api
  sensitive-headers:
  add-proxy-headers: false
  routes:
    user-service:
      path: /user/**
      service-id: USER-SERVICE
用户服务的application.yml

spring.application.name=user-service
keycloak.realm=master
keycloak.resource=my-client
keycloak.auth-server-url=http://<ip>/auth
keycloak.public-client=true
keycloak.principal-attribute=preferred_username
keycloak.securityConstraints[0].authRoles[0]=admin
keycloak.securityConstraints[0].securityCollections[0].patterns[0]=/change-password
以及在用户服务日志中创建的以下日志

2019-08-21 03:18:26.191  WARN [-,,,] 1 --- [nio-8087-exec-2] o.k.adapters.RequestAuthenticator        : SSL is required to authenticate. Remote address 169.254.0.4 is secure: false, SSL required for: EXTERNAL .
然而,当我使用无效令牌时,我得到了401错误(正如预期的那样)

我是否需要为此问题使用路由筛选器


任何帮助都将不胜感激

似乎所有外部请求都需要SSL。这可以通过
领域设置->登录->要求SSL
()中的管理控制台进行设置。 出于测试目的,您可以尝试将其设置为
None
。切勿在生产系统上执行此操作

对于客户端(在用户服务的
application.yml
中),也可以执行相同的操作:


()

我在使用反向代理时也遇到了这个问题,该代理后面有集成keyloak的微服务。该错误的原因是keydape的某种安全实现,它检查反向代理提供的X-Forward头。这是解释它的细节,但老实说,我并不真正理解为什么它是必需的。因此,消除此错误的一个简单解决方案是简单地丢弃X-Forward头,这使请求看起来像一个内部请求

在祖尔:

zuul:
  add-proxy-headers: false
在Spring云网关中:

spring:
  cloud:
    gateway:
      x-forwarded:
        port-enabled: false
        host-enabled: false
        proto-enabled: false
        port-append: false
        host-append: false
        proto-append: false
        enabled: false

在反向代理背后的每个微服务上设置
keydeport.ssl required
,可能也可以工作,但我没有尝试。我更喜欢只在一个地方进行配置。

谢谢您的及时回复。通过管理控制台进行的设置不起作用。我目前使用的是KeyClope 5.0版。你能解释一下你上次的建议吗?你收到同样的错误了吗?这对于版本5也应该是一样的-我更新了我的答案。在将
代理地址\u转发
设置为
后,我发现
获取失败
错误。此外,我在swagger中获得()作为请求URL
169.254.3.6
是从docker composeOK创建的默认网络的ip4地址,很抱歉我弄错了。你的钥匙斗篷不在代理后面,对吗?那么,如果将requiressl设置为None,会发生什么呢?还有其他错误吗?没有。我也有同样的错误。我上面已经提到过。
zuul:
  add-proxy-headers: false
spring:
  cloud:
    gateway:
      x-forwarded:
        port-enabled: false
        host-enabled: false
        proto-enabled: false
        port-append: false
        host-append: false
        proto-append: false
        enabled: false