如何通过API对Keycloak授权策略、权限执行CRUD操作?
嘿,刚好我之前折腾过Keycloak的授权API,来给你理清楚正确的操作方式:
首先得明确:你用的/authz/protection/resource_set端点确实只负责资源(Resource)和作用域(Scope)的CRUD,它不支持携带policies参数,所以返回“Unrecognized field "policies"”是正常的——策略和权限有专门的API端点。
Keycloak针对授权策略、权限的CRUD,主要是通过**/auth/realms/${realm_name}/authz/admin**路径下的API实现的(这个路径属于管理端API,需要管理员权限的Access Token)。下面给你逐个拆解Postman里的操作步骤:
第一步:获取管理员Access Token
在调用这些管理API之前,你需要先拿到管理员身份的Token。用Postman发一个POST请求:
- URL:
http://${host}:${port}/auth/realms/${realm_name}/protocol/openid-connect/token - 请求体(x-www-form-urlencoded格式):
grant_type:passwordclient_id:admin-cliusername: 你的管理员用户名password: 你的管理员密码
- 响应里的
access_token就是后续请求要用的凭证,把它放在请求头的Authorization字段里,格式为Bearer ${access_token}。
第二步:策略(Policy)的CRUD操作
Keycloak支持多种策略类型(角色、用户、客户端、时间等),不同类型的策略对应不同的API路径,下面以最常用的角色策略为例:
创建角色策略
- HTTP方法:POST
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/policy/role - 请求体(JSON格式):
{ "name": "Admin Access Policy", "description": "允许拥有admin角色的用户访问指定资源", "roles": [ { "id": "你的admin角色ID", "name": "admin" } ], "resources": [ { "id": "你要关联的资源ID" } ], "decisionStrategy": "UNANIMOUS" // 策略决策逻辑,可选UNANIMOUS/ANY/CONSENSUS }
查询所有策略
- HTTP方法:GET
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/policy - 可以添加查询参数过滤,比如
?name=Admin Access Policy按名称查找。
更新策略
- HTTP方法:PUT
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/policy/${policy_id} - 请求体:和创建时的结构一致,修改需要更新的字段即可。
删除策略
- HTTP方法:DELETE
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/policy/${policy_id}
其他类型的策略(比如用户策略、客户端策略),只需要把路径里的role换成user/client,请求体调整对应字段即可。
第三步:权限(Permission)的CRUD操作
权限主要用来关联资源和策略,分为资源权限和范围权限,这里以资源权限为例:
创建资源权限
- HTTP方法:POST
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/permission/resource - 请求体(JSON格式):
{ "name": "Resource Admin Permission", "description": "通过Admin Access Policy控制资源访问", "resources": [ { "id": "你的资源ID" } ], "policies": [ { "id": "你要关联的策略ID" } ] }
查询所有权限
- HTTP方法:GET
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/permission
更新权限
- HTTP方法:PUT
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/permission/resource/${permission_id} - 请求体:修改关联的资源或策略即可。
删除权限
- HTTP方法:DELETE
- URL:
http://${host}:${port}/auth/realms/${realm_name}/authz/admin/permission/resource/${permission_id}
注意事项
- 所有这些API都需要管理员权限的Access Token,普通用户的Token无法调用。
- 如果需要操作范围权限,把路径里的
resource换成scope即可,请求体里关联对应的作用域ID。 - 你可以通过Keycloak后台的“授权”页面,先手动创建一个策略/权限,然后用GET请求查看返回的结构,照着这个结构写Postman的请求体,会更准确。
内容的提问来源于stack exchange,提问作者mmp5pow
相关产品推荐
相关产品推荐

