配置授权

本指南将介绍如何配置 Keycloak Authorization Services,以使用细粒度策略保护资源。有关背景概念,请参阅 授权服务。

前提条件

  • 一个具有 confidential OIDC client 的 Keycloak Realm(请参阅 管理客户端)。
  • 在客户端上启用 Authorization(客户端 Settings > Authorization 开关)。

第 1 步:定义资源

资源表示你的应用保护的实体。

  1. 在客户端的 Authorization 选项卡中,单击 Resources。
  2. 单击 Create resource。
  3. 配置:
字段描述示例
Name资源的描述性名称Document
Display Name面向用户的名称(用于 UMA 同意界面)Document
Type资源的类别标签urn:my-app:resources:document
URIs此资源所表示的 URI 模式/api/documents/*
Scopes允许在此资源上执行的操作view, edit, delete
  1. 单击 Save。

第 2 步:定义 Scopes

如果你需要除资源内联创建之外的其他 scopes:

  1. 单击 Authorization scopes。
  2. 单击 Create authorization scope。
  3. 输入 Name(例如,approve)。
  4. 单击 Save。

第 3 步:创建策略

策略定义授予访问权限的条件。

创建基于角色的策略

  1. 单击 Policies > Create policy > Role。
  2. 输入 Name(例如,Managers Only)。
  3. 添加所需的 realm 或 client 角色(例如,manager)。
  4. 将 Logic 设置为 Positive(满足条件时授予)或 Negative(满足时拒绝)。
  5. 单击 Save。

创建基于组的策略

  1. 单击 Create policy > Group。
  2. 输入 Name。
  3. 选择应具有访问权限的组。
  4. 启用 Extend to Children 以包含子组。
  5. 单击 Save。

创建基于时间的策略

  1. 单击 Create policy > Time。
  2. 配置时间窗口:
    • Not Before / Not On or After — 日期范围。
    • Day of Month / Month / Year — 日历约束。
    • Hour / Minute — 每日时间约束。
  3. 单击 Save。

创建基于用户的策略

  1. 单击 Create policy > User。
  2. 选择应具有访问权限的特定用户。
  3. 单击 Save。

创建聚合策略

聚合策略使用决策策略将多个子策略组合在一起。

  1. 单击 Create policy > Aggregated。
  2. 输入 Name。
  3. 将 Decision Strategy 设置为 Unanimous、Affirmative 或 Consensus。
  4. 添加子策略。
  5. 单击 Save。

第 4 步:创建权限

权限将资源和 scopes 绑定到策略。

创建基于资源的权限

  1. 单击 Permissions > Create resource-based permission。
  2. 输入 Name(例如,Document Access)。
  3. 选择此权限适用的 Resources。
  4. 选择要评估的 Policies。
  5. 设置用于组合策略结果的 Decision Strategy。
  6. 单击 Save。

创建基于 Scope 的权限

  1. 单击 Create scope-based permission。
  2. 输入 Name(例如,Document Edit Permission)。
  3. 选择 Resources(可选 — 如果省略,则适用于所有资源)。
  4. 选择 Scopes(例如,edit)。
  5. 选择 Policies。
  6. 单击 Save。

第 5 步:测试策略

在部署前,使用内置的策略评估工具测试你的授权配置。

  1. 单击 Authorization 部分中的 Evaluate 选项卡。
  2. 选择或创建一个测试用户。
  3. 选择客户端 scope 上下文。
  4. 添加要评估的资源和 scope 权限。
  5. 单击 Evaluate。
  6. 查看结果:
    • PERMIT — 已授予访问权限。
    • DENY — 已拒绝访问。
    • 展开每个结果,查看哪些策略促成了该决策。

从你的应用获取授权

请求 Requesting Party Token (RPT)

# Exchange an access token for an RPT with specific resource permissions
curl -s -X POST \
  "https://<keycloak-host>/realms/<realm>/protocol/openid-connect/token" \
  -H "Authorization: Bearer <access-token>" \
  -d "grant_type=urn:ietf:params:oauth:grant-type:uma-ticket" \
  -d "audience=<client-id>" \
  -d "permission=<resource-id>#<scope>"

响应包含一个 RPT(嵌入权限的访问令牌)。

对 RPT 进行 Introspect

curl -s -X POST \
  "https://<keycloak-host>/realms/<realm>/protocol/openid-connect/token/introspect" \
  -d "token=<rpt>" \
  -d "client_id=<client-id>" \
  -d "client_secret=<client-secret>" \
  -d "token_type_hint=requesting_party_token"

响应包含一个 permissions 数组,其中列出了已授予的资源和 scopes。

导出和导入

Authorization 配置(resources、scopes、policies、permissions)可以导出为 JSON,以便进行版本控制或迁移:

  1. 在 Authorization 选项卡中,单击 Export settings。
  2. JSON 包含所有 resources、scopes、policies 和 permissions。
  3. 如需导入,请使用 Import 按钮,或在 KeycloakRealmImport CR 中的客户端定义里包含 Authorization 配置。