【问题标题】:Missing users from Keycloak Realm after import导入后 Keycloak Realm 中的用户丢失
【发布时间】:2021-08-14 10:44:22
【问题描述】:

我正在尝试将领域配置和用户导入 Keycloak。领域正在正常导入,但即使 keycloak-logs 正在打印用户已导入,用户仍然丢失。

keycloak_1             | 12:33:31,635 INFO  [org.keycloak.exportimport.dir.DirImportProvider] (ServerService Thread Pool -- 59) Imported users from /opt/jboss/keycloak/imports/myrealm-users-0.json
keycloak_1             | 12:33:31,798 INFO  [org.keycloak.services] (ServerService Thread Pool -- 59) KC-SERVICES0032: Import finished successfully

以下是docker-compose文件的配置。

keycloak:
    depends_on:
      - postgresql
    image: Keycloak_registry
    ports:
      - "31081:31081"
    volumes:
      - ./imports:/opt/jboss/keycloak/imports
    environment:
      KEYCLOAK_PROPS: -Dkeycloak.import=/opt/jboss/keycloak/imports/fin4u-realm.json,/opt/jboss/keycloak/imports/myrealm-users-0.json -Dkeycloak.profile.feature.upload_scripts=enabled -Dkeycloak.migration.action=import -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=          KEYCLOAK_ADDITIONAL_PROPS: -Dkeycloak.import=/opt/jboss/keycloak/imports/myrealm-realm.json,/opt/jboss/keycloak/imports/myrealm-users-0.json -Dkeycloak.profile.feature.upload_scripts=enabled -Dkeycloak.migration.action=import -Dkeycloak.migration.provider=dir -Dkeycloak.migration.dir=/opt/jboss/keycloak/imports -Dkeycloak.migration.strategy=IGNORE_EXISTING/opt/jboss/keycloak/imports -Dkeycloak.migration.strategy=IGNORE_EXISTING
      HOSTNAME: localhost
      CERTBASE: localhost
      HTTPS_PORT: 38081
      KEYCLOAK_JGROUPS_PORT: 9000

所以在上面的 yaml 代码中,可以看到 Realm Configuration 和 Users 是要导入的目标。领域已成功导入,但即使日志显示用户也已导入,用户仍然丢失。

【问题讨论】:

    标签: java docker docker-compose keycloak keycloak-services


    【解决方案1】:

    以下建议针对 Keycloak 16.1.1 (jboss/keycloak image) 进行了测试,并基于 Keycloak 官方文档中的 Importing and exporting the database 章节。

    使用正确的导入参数

    文档指出:

    您不能将keycloak.import 参数与keycloak.migration.X 参数一起使用。如果将这些参数一起使用,Keycloak 会忽略 keycloak.import 参数。 keycloak.import 机制会忽略 Keycloak 中已经存在的领域。 keycloak.import 机制便于开发,但如果需要更大的灵活性,请使用keycloak.migration.X 参数。

    因此,我在以下解决方案中仅使用了keycloak.migration.X 选项。

    命名约定

    我们可以在文档中看到:

    从目录导入时,文件名必须遵循以下命名约定:

    • -realm.json。例如,名为“acme-roadrunner-affairs”的领域的“acme-roadrunner-affairs-realm.json”。
    • -users-.json。例如,“acme-roadrunner-affairs-users-0.json”表示名为“acme-roadrunner-affairs”的领域的第一个用户文件。

    在我的示例项目中,我有 keep-growing 领域。因此,导入文件命名为:keep-growing-realm.jsonkeep-growing-users-0.json

    音量

    docker-compose.yml 文件中的示例卷配置:

    version: '3.3'
    services:
      keycloak:
        …
        volumes:
          - ./keycloak/realms/import:/tmp/import
        …
    

    我机器上的./keycloak/realms/import 包含:

    因此,在重新启动 docker 实例后,我可以在容器中看到我机器上上述位置的所有文件:

    最小导入配置

    我在docker-compose.yml 文件中添加了以下命令:

    version: '3.3'
    services:
      keycloak:
        …
        volumes:
           …
        command:
          - "-Dkeycloak.migration.action=import"
          - "-Dkeycloak.migration.provider=dir"
          - "-Dkeycloak.migration.dir=/tmp/import"
    

    这将在容器启动时导入领域并覆盖现有领域(如果已经存在)。

    重新创建容器以测试导入

    我删除了容器并重新启动它。用户已正确导入:

    验证日志

    正如我们在问题描述中看到的,日志并不能保证导出成功。但是,我决定在此处包含启动容器后收到的条目:

    INFO  [org.keycloak.exportimport.dir.DirImportProvider] (ServerService Thread Pool -- 62) Importing from directory /tmp/import
    …
    INFO  [org.keycloak.services] (ServerService Thread Pool -- 62) KC-SERVICES0050: Initializing master realm
    INFO  [org.keycloak.services] (ServerService Thread Pool -- 56) KC-SERVICES0030: Full model import requested. Strategy: OVERWRITE_EXISTING
    INFO  [org.keycloak.exportimport.util.ImportUtils] (ServerService Thread Pool -- 56) Realm 'keep-growing' imported
    INFO  [org.keycloak.exportimport.dir.DirImportProvider] (ServerService Thread Pool -- 56) Imported users from /tmp/import/keep-growing-users-0.json
    INFO  [org.keycloak.services] (ServerService Thread Pool -- 56) KC-SERVICES0032: Import finished successfully
    

    供参考

    完整的docker-compose.yml 文件:

    version: '3.3'
    services:
      keycloak:
        image: jboss/keycloak:${KEYCLOAK_VERSION}
        ports:
          - "8024:8080"
        environment:
          - KEYCLOAK_USER=${KEYCLOAK_USER}
          - KEYCLOAK_PASSWORD=${KEYCLOAK_PASSWORD}
        volumes:
          - ./keycloak/realms/import:/tmp/import
        command:
          - "-Dkeycloak.migration.action=import"
          - "-Dkeycloak.migration.provider=dir"
          - "-Dkeycloak.migration.dir=/tmp/import"
    

    .env 文件:

    KEYCLOAK_VERSION=16.1.1
    KEYCLOAK_USER=keycloak
    KEYCLOAK_PASSWORD=keycloak
    

    编辑:我在Keycloak in Docker #6 - How to import realms from a directory 帖子中写了更多关于 Keycloak 目录导入的内容。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2022-09-24
      • 2012-08-06
      • 2018-01-07
      • 1970-01-01
      • 2023-01-31
      • 2021-08-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多