我在 Keycloak 中创建了要导出的用户和角色。
当我尝试使用 UI 中领域的“导出”按钮导出它们时,我下载了一个 JSON 文件。
但是我在导出的文件中找不到任何用户或角色
realm.json
如何从 Keycloak 导出包含用户和角色的领域 JSON?
更新:从
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
按照 dreamcrash 的 指南 导出用户和角色时,您可能希望在一个脚本中实现所有功能:
您可以使用命令行工具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"
}
]
}
独立使用Keycloak:
bin\kc.bat export --file realm_export.json --realm test_realm --users realm_file