从 Keycloak 导出用户和角色

c'e*_*moi 12 export keycloak

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

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

在此输入图像描述

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

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

dre*_*ash 12

更新:从Keycloak 17 Quarkus 发行版/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"
Run Code Online (Sandbox Code Playgroud)

您将收到带有管理员令牌的 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"
Run Code Online (Sandbox Code Playgroud)

获取领域角色

curl -X GET https://$KEYCLOAK_HOST/auth/admin/realms/$REALM_NAME/roles \
     -H "Content-Type: application/json" \
     -H "Authorization: bearer $ACCESS_TOKEN"
Run Code Online (Sandbox Code Playgroud)

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

分配适当的用户权限

对于那些不想从主管理员用户获取访问令牌的人,您可以从其他用户获取访问令牌,但该用户需要客户端view-users的许可realm-management。为此,您可以:

(旧的 Keycloak 用户界面)

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

(新的Keycloak UI)

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


hc_*_*dev 8

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

  1. 领域导出为 JSON,就像使用 UI 按钮一样
  2. 获取用户数组并将其添加到此 JSON
  3. 获取角色数组并将其添加到此 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
Run Code Online (Sandbox Code Playgroud)

生成的文件keycloak_${REALM_NAME}_realm-incl-users-roles.json可能类似于以下简化示例:

{
  "realm": "master",
  "users": [
    {
      "id": "user1"
    },
    {
      "id": "user2"
    }
  ],
  "roles": [
    {
      "id": "role1"
    },
    {
      "id": "role2"
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)