从 KeyCloak 导出所有用户

我有一个特定的用例,我们希望每天为所有用户以及每个用户的组和角色请求Keycloak。用于与其他内部系统的对账目的。

目前,我们正在使用用户资源中提供的密钥保护终结点来实现此目的。但是我们看到,每次调用后,性能都会降低到我们不能再使用此解决方案的地步。该领域有超过30K用户。

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

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


答案 1

我通过docker使用并行启动容器完成了此操作,该容器连接到现有的keycloak db。

请使用与真正的 Kea 斗篷相同版本的容器钥匙斗篷。由于版本之间的数据库架构差异。

出口

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 中绑定你的文件夹,而不仅仅是 realm 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

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


推荐