从 KeyCloak 导出所有用户

Posted

技术标签:

【中文标题】从 KeyCloak 导出所有用户【英文标题】:Export all users from KeyCloak 【发布时间】:2018-08-02 11:20:41 【问题描述】:

我有一个特定的用例,我们希望每天向 Keycloak 询问所有用户以及每个用户的组和角色。用于与其他内部系统进行核对。

目前我们正在为此使用 UsersResource 中提供的 Keycloak 端点。但是我们看到每次调用后性能都会下降到我们不能再使用这个解决方案的地步。该领域有超过 30K 的用户。

我们还看到 Keycloak 可以导出数据库,但只能在系统启动时导出(我猜是出于迁移目的)。鉴于我们想每天提取所有用户,我们不能使用它。

是否有一些已知的功能或解决方法?

【问题讨论】:

您使用的是 KC 提供的数据库还是其他一些外部数据库? 外部 postgresql 。所以直接查询是可能的,但我们的最后一个选择;-) 如果是内部使用我想你可以使用一些直接查询...不过,对于性能问题,您是否考虑过更强大的机器?甚至升级KC版本?您是否使用某种分页来列出它们? 是的,我们有。 25 个用户需要 2 秒,50 个用户需要 4 秒。升级服务器可能会有所帮助,但我猜 API 不是针对这种请求而设计的。直接查询似乎是目前的解决方案 @Michel 你找到解决方案了吗?当我导出领域时,不会导出用户。 【参考方案1】:

我已经通过 docker 使用并行启动容器完成了它,它连接到现有的 keycloak db。

请使用与真正的keacloak 相同版本的容器keycloak。 由于版本之间的 db 架构差异。

导出

docker run --rm\
    --name keycloak_exporter\
    -v /tmp:/tmp/keycloak-export:Z\
    -e POSTGRES_DATABASE=keycloak\
    -e POSTGRES_PASSWORD=PASSOWRD_PLEASE\
    -e POSTGRES_USER=keycloak\
    -e DB_VENDOR=POSTGRES\
    -e POSTGRES_PORT_5432_TCP_ADDR=postgresql.local\
    jboss/keycloak:3.4.3.Final\
    -Dkeycloak.migration.action=export\
    -Dkeycloak.migration.provider=dir\
    -Dkeycloak.migration.dir=/tmp/keycloak-export\
    -Dkeycloak.migration.usersExportStrategy=SAME_FILE\
    -Dkeycloak.migration.realmName=therealm

导入

docker run --rm\
    --name keycloak_importer\
    -v /tmp:/tmp/keycloak-import:Z\
    -e POSTGRES_DATABASE=keycloak_dest\
    -e POSTGRES_PASSWORD=PASSOWRD_DEST_PLEASE\
    -e POSTGRES_USER=keycloak\
    -e DB_VENDOR=POSTGRES\
    -e POSTGRES_PORT_5432_TCP_ADDR=postgresql2.local\
    jboss/keycloak:3.4.3.Final\
    -Dkeycloak.migration.action=import\
    -Dkeycloak.migration.provider=dir\
    -Dkeycloak.migration.dir=/tmp/keycloak-import\
    -Dkeycloak.migration.strategy=IGNORE_EXISTING\
    -Dkeycloak.migration.usersExportStrategy=SAME_FILE\
    -Dkeycloak.migration.realmName=therealm

可能的配置选项: https://github.com/keycloak/keycloak-documentation/blob/master/server_admin/topics/export-import.adoc

【讨论】:

【参考方案2】:

您需要在您的 docker-compose-yml 中绑定您的文件夹,而不仅仅是领域 json 文件,如下所示:

keycloak:
    image: jboss/keycloak:8.0.1
    container_name: "keycloak"
     volumes:
      - ./realms/:/tmp/
    environment:
      - KEYCLOAK_USER=admin
      - KEYCLOAK_PASSWORD=admin
      - KEYCLOAK_IMPORT=/tmp/realm-export.json -Dkeycloak.profile.feature.upload_scripts=enabled 

realms 是您在 yaml 文件旁边的文件夹。此时,您可以像往常一样使用基本的 realm-export.json 运行 docker-compose up -d,进入管理面板,添加具有凭据和角色的用户,然后使用此命令,您将能够导出整个配置:

docker exec -it keycloak /opt/jboss/keycloak/bin/standalone.sh -Djboss.socket.binding.port-offset=100 -Dkeycloak.migration.action=export -Dkeycloak.migration.provider=singleFile -Dkeycloak.migration.realmName=ed-realm -Dkeycloak.migration.usersExportStrategy=REALM_FILE -Dkeycloak.migration.file=/tmp/export.json

您将在您的领域文件夹中看到将创建一个新文件,它将包含整个配置,因此您可以运行 docker-compose down,用这个新文件替换旧文件,然后再次运行 docker-compose up as您想要多次,并在您再次更改您的领域时重做该过程。

【讨论】:

以上是关于从 KeyCloak 导出所有用户的主要内容,如果未能解决你的问题,请参考以下文章

Keycloak - 将所有用户映射到角色

Keycloak:订阅诸如创建用户之类的事件以触发网络服务

如何从 Keycloak REST API 获取用户?

在使用Keycloak保护的Web应用程序中获取登录用户名

如何使用嵌入式密钥斗篷进行完整导出(包括用户)

我们如何在 Keycloak 授权服务策略中为所有用户分配权限?