spring-boot - Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应

标签 spring-boot docker keycloak netflix-zuul

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

请注意,我还将 docker0 的子网和网关更改为 169.254.0.1/24169.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

这是我的问题

1) 当我不使用 zuul 代理(即 http//:8082/change-password)时,我可以使用有效的 keycloak token 成功获得响应。但是当使用 http//:8765/api/user/change-passworddocker-compose.yml 指定默认子网时,我无法得到响应。 p>

对于有效 token ,我总是会收到以下响应 header ,状态为 200。

 cache-control: private 
 date: Wed, 21 Aug 2019 11:02:02 GMT 
 expires: Thu, 01 Jan 1970 00:00:00 GMT 
 transfer-encoding: chunked

并在用户服务日志中创建以下日志。

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 .

但是,当我使用无效 token 时,出现 401 错误(正如预期的那样)。

我需要为这个问题使用路由过滤器吗???

任何帮助将不胜感激!

最佳答案

似乎所有外部请求都需要 SSL。这可以设置,例如通过管理控制台 Realm Settings -> Login -> Require SSL ( https://www.keycloak.org/docs/5.0/server_admin/index.html#_ssl_modes )。 出于测试目的,您可以尝试将其设置为 None。切勿在生产系统上执行此操作。

可以为客户端做同样的事情(在用户服务的 application.yml 中):

keycloak.ssl-required = none

( https://www.keycloak.org/docs/latest/securing_apps/index.html#_java_adapter_config )

关于spring-boot - Spring Boot - 无法通过 Zuul 代理获得 Keycloak 授权 api 的响应,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57594946/

相关文章:

java - Keycloak:未为联合用户保存授予的范围

java - 无法解析 Mockito 单元测试中的占位符

java - Spring JPA 一对一映射获取 null

java - 使用不带 LoadTimeWeaving 的服务自定义 UserDetails

image - 如何在 Docker 构建时删除所有关联的容器和镜像

php - 仅当容器重新启动时,本地更改才会传播到 docker 容器

python - AWS ECS 上的 PostgreSQL : psycopg2. OperationalError 端口号 5432 无效

spring - 在 Gradle 中使用 jettyRunWar 或 jettyRun 与 Spring Boot 应用程序只会在浏览器中列出一个目录

c# - 如何使用.Net Core验证KeyCloak提供的JWT?

java - Keycloak 创建用户角色