You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.01 10:43:12