Keycloak多租户场景下如何通过REST API获取单个角色/组绑定的权限
Keycloak 单用户组绑定权限查询方案
针对你基于用户组做多租户、需要单独查询指定组权限的场景,有两种成熟的落地方案:
方案1:调用授权评估接口精准查询指定组权限
该方案可以直接按需查询任意用户、任意指定用户组绑定的权限,不需要更换用户当前的登录令牌。
- 前置准备:先调用管理员登录接口获取拥有
view-authorization权限的访问令牌,后续请求头需要携带Authorization: Bearer {管理员令牌} - 接口地址:
POST /admin/realms/{你的领域名称}/clients/{机密客户端的UUID}/authz/permission/evaluate - 请求体参数:
{ "userId": "待查询用户的UUID", "groups": ["目标用户组的UUID"], // 仅填入你要查询的单个用户组ID,就会过滤其他组的权限 "resources": [], // 留空返回该组绑定的所有资源权限,也可填入指定资源ID做定向校验 "scopes": [] } - 返回说明:响应结果仅包含你指定的用户组绑定的所有资源、操作权限,不会聚合该用户所属其他组的权限。
方案2:切换租户时申请仅带目标组权限的访问令牌
如果希望后续业务请求自动只校验当前选中租户的权限,可以通过令牌交换流程,生成仅生效目标用户组权限的专属访问令牌。
- 接口地址:
POST /realms/{你的领域名称}/protocol/openid-connect/token - 请求参数(表单格式):
grant_type:urn:ietf:params:oauth:grant-type:token-exchangesubject_token: 用户当前的有效登录令牌client_id: 你的机密客户端IDclient_secret: 你的机密客户端密钥requested_token_type:urn:ietf:params:oauth:token-type:access_tokenclaims:{"groups": {"value": "group_org1"}}// 替换为你要限制的用户组名称/ID
- 使用说明:用新返回的访问令牌调用资源接口或者权限查询接口,Keycloak只会返回该用户组对应的权限,不会出现多租户权限聚合的问题。
配套辅助接口
如果需要查询用户组对应的UUID,可以调用用户组搜索接口:GET /admin/realms/{你的领域名称}/groups?search={用户组名称}
注意事项
- 提前在机密客户端的配置页开启
Authorization权限,以及Token Exchange开关,否则接口会返回403权限错误。 - 若需要同时查询多个组的权限,只需在
groups数组中填入多个用户组的UUID即可。
内容的提问来源于stack exchange,提问作者Rohit Patidar
相关产品推荐
相关产品推荐

