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

如何通过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: password
    • client_id: admin-cli
    • username: 你的管理员用户名
    • 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 07:42:41