授权服务

Keycloak 基于 User-Managed Access (UMA) 规范和功能丰富的策略评估引擎,提供细粒度授权服务。这些服务超越了基于角色的访问控制(RBAC),支持基于属性、基于时间以及具备上下文感知的授权决策。

概述

传统的 RBAC 会将角色分配给用户,并在应用代码中检查角色。Keycloak Authorization Services 将授权逻辑从应用外部化到集中式策略引擎中:

  • 原生应用 注册其受保护的资源和作用域。
  • 管理员 定义控制这些资源访问的策略。
  • Keycloak 在运行时评估策略并返回授权决策。
  • 原生应用 使用授权响应执行这些决策。

这种分离方式使授权逻辑可以集中管理,而无需更改应用代码。

关键概念

概念描述
Resource Server托管受保护资源并将授权委托给 Keycloak 的客户端应用
Resource受保护的实体(例如 API 端点、文档、数据库记录)
Scope可在资源上执行的操作(例如 view、edit、delete)
Permission将策略与特定资源和/或作用域关联起来的规则
Policy用于确定是否授予或拒绝访问的条件
Requesting Party Token (RPT)一种包含授权数据(已授予权限)的访问令牌

策略类型

Keycloak 支持多种可组合的策略类型:

策略类型描述示例
基于用户向特定用户授予访问权限允许 alice 和 bob
基于角色基于 realm 或 client 角色授予访问权限允许具有 manager 角色的用户
基于组基于组成员关系授予访问权限允许 Engineering 组成员
基于客户端向来自特定客户端的请求授予访问权限允许来自 admin-portal 客户端的请求
基于时间在特定时间窗口内授予访问权限允许在周一至周五 09:00 –18:00 访问
基于 JavaScript在运行时评估的自定义逻辑检查自定义用户属性或请求上下文
聚合使用决策策略组合多个策略所有子策略都必须授予访问权限(Unanimous),或至少一个子策略授予访问权限(Affirmative)
基于正则表达式将声明值与正则表达式进行匹配如果 department 匹配 eng-.*,则允许
Client Scope基于令牌中存在的 client scope 授予访问权限如果存在 scope admin,则允许

决策策略

当某个权限引用多个策略时,决策策略决定如何组合各个单独的策略决策:

策略描述
Unanimous所有策略都必须授予访问权限(AND 逻辑)
Affirmative至少有一个策略必须授予访问权限(OR 逻辑)
Consensus多数策略必须授予访问权限

授权流程

  1. 客户端应用向 Keycloak 请求访问令牌。
  2. 客户端将访问令牌发送到资源服务器(API)。
  3. 资源服务器向 Keycloak token endpoint 请求 RPT,并指定正在访问的资源和 scope。
  4. Keycloak 评估所有适用的策略,并返回一个包含已授予权限的 RPT(或拒绝该请求)。
  5. 资源服务器检查 RPT 权限,并允许或拒绝该操作。

另外,资源服务器也可以调用 token introspection endpoint 来评估权限,而无需获取 RPT。

启用授权服务

授权服务按客户端启用:

  1. 在 Admin Console 中,进入 Clients 并选择目标客户端。
  2. 启用 Client authentication(该客户端必须是 confidential)。
  3. 启用 Authorization。
  4. 单击 Save。
  5. 会出现一个新的 Authorization 选项卡,其中包含 resources、scopes、policies 和 permissions 的子部分。

有关分步配置,请参阅 Configure Authorization。

User-Managed Access (UMA)

UMA 扩展了授权模型,使 resource owners(终端用户)能够管理对其自身资源的访问。使用 UMA:

  • 用户可以与其他用户或组共享资源。
  • 用户可以批准或拒绝访问请求。
  • 授权决策会遵循资源所有者的策略。

UMA 是一项高级功能,主要用于终端用户需要对资源共享进行细粒度控制的场景(例如文档共享、API 访问委托)。