Keycloak 19:如何通过官方API获取客户端角色列表?
用Keycloak官方API替代内部接口实现客户端作用域角色分配
你提到的auth/admin/realms/abcde/admin-ui-available-roles/clientScopes/{id}是Keycloak UI的内部私有接口,不会出现在官方公开文档中。要实现相同的角色筛选和分配功能,需要用Keycloak官方公开的Admin API组合完成,以下是Bash脚本实现的完整流程:
1. 获取Admin访问令牌
首先需要调用Keycloak的令牌接口获取具有管理员权限的访问令牌:
# 替换为你的Keycloak地址、管理员账号密码 KEYCLOAK_URL="http://your-keycloak-domain/auth" ADMIN_USER="admin" ADMIN_PWD="your-admin-password" REALM="abcde" # 获取令牌 TOKEN_RESPONSE=$(curl -s -X POST "$KEYCLOAK_URL/realms/master/protocol/openid-connect/token" \ -H "Content-Type: application/x-www-form-urlencoded" \ -d "username=$ADMIN_USER" \ -d "password=$ADMIN_PWD" \ -d "grant_type=password" \ -d "client_id=admin-cli") # 提取access_token(需提前安装jq工具) ACCESS_TOKEN=$(echo "$TOKEN_RESPONSE" | jq -r '.access_token')
2. (可选)通过客户端作用域名称获取ID
如果你只有客户端作用域的名称,需要先查询它的ID:
CLIENT_SCOPE_NAME="your-client-scope-name" CLIENT_SCOPE_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/client-scopes?name=$CLIENT_SCOPE_NAME" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq -r '.[0].id')
3. (可选)通过客户端名称获取目标客户端ID
要实现“按客户端筛选”的功能,先获取目标客户端的ID:
TARGET_CLIENT_NAME="your-target-client-name" CLIENT_ID=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/clients?name=$TARGET_CLIENT_NAME" \ -H "Authorization: Bearer $ACCESS_TOKEN" | jq -r '.[0].id')
4. 获取目标客户端的所有角色
查询该客户端下的全部角色:
ALL_CLIENT_ROLES=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/clients/$CLIENT_ID/roles" \ -H "Authorization: Bearer $ACCESS_TOKEN")
5. 获取客户端作用域已关联的角色
查询当前客户端作用域已经绑定的角色:
ASSIGNED_ROLES=$(curl -s -X GET "$KEYCLOAK_URL/admin/realms/$REALM/client-scopes/$CLIENT_SCOPE_ID/roles" \ -H "Authorization: Bearer $ACCESS_TOKEN")
6. 筛选出可分配的未关联角色
用jq对比两个角色列表,提取出尚未绑定到客户端作用域的角色:
AVAILABLE_ROLES=$(echo "$ALL_CLIENT_ROLES" | jq --argjson assigned "$ASSIGNED_ROLES" \ '.[] | select(.id | IN($assigned[].id) | not)')
7. 批量分配角色到客户端作用域
遍历筛选出的角色,逐个绑定到目标客户端作用域:
echo "$AVAILABLE_ROLES" | jq -c '.[]' | while read -r ROLE; do ROLE_ID=$(echo "$ROLE" | jq -r '.id') ROLE_NAME=$(echo "$ROLE" | jq -r '.name') curl -s -X POST "$KEYCLOAK_URL/admin/realms/$REALM/client-scopes/$CLIENT_SCOPE_ID/roles" \ -H "Authorization: Bearer $ACCESS_TOKEN" \ -H "Content-Type: application/json" \ -d "[{\"id\":\"$ROLE_ID\",\"name\":\"$ROLE_NAME\",\"clientId\":\"$CLIENT_ID\"}]" done
注意事项
- 确保已安装
jq工具用于JSON解析,Bash脚本依赖它处理返回结果 - Keycloak 19的Admin API路径以
auth/admin/开头,若升级到新版(如23.x),路径会简化为/admin/,需对应调整URL - 若不需要按客户端筛选,可跳过步骤3,直接查询所有客户端的角色后再筛选
内容的提问来源于stack exchange,提问作者littleAlien
相关产品推荐
相关产品推荐

