从Keycloak导出用户和角色

问题描述 投票:0回答:4

我在 Keycloak 中创建了要导出的用户和角色。

当我尝试使用 UI 中领域的“导出”按钮导出它们时,我下载了一个 JSON 文件。

enter image description here

但是我在导出的文件中找不到任何用户或角色

realm.json

如何从 Keycloak 导出包含用户和角色的领域 JSON?

export keycloak
4个回答
13
投票

更新:

Keycloak 17 Quarkus distribution
开始删除了/auth路径。因此,您可能需要从此答案中显示的端点调用中删除
/auth


您将无法使用导出功能来执行此操作。但是,您可以使用 Keycloak Admin REST API 获取该信息;要调用该 API,您需要具有适当权限的用户提供的访问令牌。目前,我将使用

admin
领域中的
master
用户,但稍后我将解释如何使用其他用户:

curl https://$KEYCLOAK_HOST/auth/realms/master/protocol/openid-connect/token \
    -d "client_id=admin-cli" \
    -d "username=$ADMIN_NAME" \
    -d "password=$ADMIN_PASSWORD" \
    -d "grant_type=password"

您将收到带有管理员令牌的 JSON 响应。从该响应中提取属性

access_token
的值。让我们将其保存在变量
$ACCESS_TOKEN
中以供以后参考。

要从您的领域$REALM_NAME

获取用户列表

curl -X GET https://$KEYCLOAK_HOST/auth/admin/realms/$REALM_NAME/users \
     -H "Content-Type: application/json" \
     -H "Authorization: bearer $ACCESS_TOKEN"

获取领域角色

curl -X GET https://$KEYCLOAK_HOST/auth/admin/realms/$REALM_NAME/roles \
     -H "Content-Type: application/json" \
     -H "Authorization: bearer $ACCESS_TOKEN"

现在您只需将来自这些端点的 JSON 响应保存到 JSON 文件中。

分配适当的用户权限

对于那些不想从主管理员用户那里获取访问令牌的人,您可以从其他用户那里获取它,但该用户需要来自

view-users
客户端的权限
realm-management
。为此,您可以:

(旧Keycloak UI)

  • 转到“用户”,然后转到相关用户
  • 转到选项卡
    Role Mappings
  • client roles
    中选择
    realm-management
  • 选择角色
    view-users
    并点击
    Add selected

(新的Keycloak UI)

  • 转到“用户”,然后转到相关用户
  • 转到选项卡
    Role Mappings
  • 点击
    Assign role
  • Search by role name
    中输入
    view-users
  • 选择角色并分配它

8
投票

按照 dreamcrash 的 指南 导出用户和角色时,您可能希望在一个脚本中实现所有功能:

  1. realm 导出为 JSON,就像使用 UI 按钮完成的那样
  2. 获取 users 数组并将其添加到此 JSON
  3. 获取 roles 数组并将其添加到此 JSON

您可以使用命令行工具jq来集成所有3个JSON部分:

# define the variables: url, credentials to access REST API, and the realm to export
KEYCLOAK_URL="https://localhost:8080"
KEYCLOAK_REALM="master"
KEYCLOAK_USER="admin"
KEYCLOAK_SECRET="secret"
REALM_NAME="myRealm"

# obtain the access token
ACCESS_TOKEN=$(curl -X POST "${KEYCLOAK_URL}/auth/realms/${KEYCLOAK_REALM}/protocol/openid-connect/token" \
  -H "Content-Type: application/x-www-form-urlencoded" \
  -d "username=${KEYCLOAK_USER}" \
  -d "password=${KEYCLOAK_SECRET}" \
  -d "grant_type=password" \
  -d 'client_id=admin-cli' \
  | jq -r '.access_token')

# export the realm as JSON
curl -X GET "${KEYCLOAK_URL}/auth/admin/realms/${REALM_NAME}"
  -H "Accept: application/json" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  > keycloak_${REALM_NAME}_realm.json

# export the users
curl -X GET "${KEYCLOAK_URL}/auth/admin/realms/${REALM_NAME}/users" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  > keycloak_${REALM_NAME}_users.json

# export the roles
curl -X GET "${KEYCLOAK_URL}/auth/admin/realms/${REALM_NAME}/roles" \
  -H "Accept: application/json" \
  -H "Authorization: Bearer ${ACCESS_TOKEN}" \
  > keycloak_${REALM_NAME}_roles.json

# integrate all 3 using jq's slurp
jq -s '.[0] + {users:.[1], roles:.[2]}' \
  keycloak_${REALM_NAME}_realm.json \ 
  keycloak_${REALM_NAME}_users.json \
  keycloak_${REALM_NAME}_roles.json \
  > keycloak_${REALM_NAME}_realm-incl-users-roles.json

生成的文件

keycloak_${REALM_NAME}_realm-incl-users-roles.json
可能看起来像这个简化的示例:

{
  "realm": "master",
  "users": [
    {
      "id": "user1"
    },
    {
      "id": "user2"
    }
  ],
  "roles": [
    {
      "id": "role1"
    },
    {
      "id": "role2"
    }
  ]
}

2
投票

独立使用Keycloak:

bin\kc.bat export --file realm_export.json --realm test_realm --users realm_file

如此处文档中所述 https://www.keycloak.org/server/importExport


0
投票

在当前版本的 Keycloak 中,如果不使用目录作为目标,则“不可能”使用以下选项: kc.bat export --file realm_export.json --realm test_realm --users realm_file

当使用目录作为目标时,它确实有效。例如:

kc.bat export --dir realm --realm demo --users different_files

参考:
如何导出Keycloak Realm

© www.soinside.com 2019 - 2024. All rights reserved.