5.3. 基于 JavaScript 的策略
如果您的策略实现使用基于属性的访问控制(ABAC),如以下示例所示,请确保用户无法编辑受保护的属性,并且对应的属性是只读的。请参阅 Threat 模型缓解 章节中的详细信息。
您可以使用这类策略使用 JavaScript 为权限定义条件。它是红帽构建的 Keycloak 支持的基于规则的策略类型,并提供根据 评估 API 编写任何策略的灵活性。
要创建基于 JavaScript 的新策略,请在策略列表右上角的 item 列表中选择 JavaScript。
默认情况下,JavaScript 策略无法上传到服务器。您应该更喜欢直接将 JS 策略部署到服务器,如 JavaScript 提供程序 中所述。
5.3.1. 从部署的 JAR 文件创建 JS 策略 复制链接链接已复制到粘贴板!
红帽构建的 Keycloak 允许您部署 JAR 文件,以便将脚本部署到服务器。如需了解更多详细信息,请参阅 JavaScript Providers。
部署脚本后,您应能够从可用策略提供程序列表中选择部署的脚本。
5.3.2. 例子 复制链接链接已复制到粘贴板!
5.3.2.1. 从评估上下文中检查属性 复制链接链接已复制到粘贴板!
以下是使用基于 JavaScript 的策略的简单示例,它使用基于属性的访问控制(ABAC)根据从执行上下文获取的属性来定义条件:
5.3.2.2. 从当前身份检查属性 复制链接链接已复制到粘贴板!
以下是基于 JavaScript 的策略的简单示例,它使用基于属性的访问控制(ABAC)根据与当前身份关联的属性来定义条件:
其中,这些属性从授权请求中使用的令牌中定义任何声明。
5.3.2.3. 检查授予当前身份的角色 复制链接链接已复制到粘贴板!
您还可以在策略中使用基于角色的访问控制(RBAC)。在以下示例中,我们将检查用户是否被授予了 keycloak_user 域 角色:
或者,您可以检查用户是否被授予了 my-client-role 客户端角色,其中 my-client 是客户端应用程序的客户端 ID:
5.3.2.4. 检查授予用户的角色 复制链接链接已复制到粘贴板!
检查授予用户的域角色:
const realm = $evaluation.getRealm();
if (realm.isUserInRealmRole('marta', 'role-a')) {
$evaluation.grant();
}
const realm = $evaluation.getRealm();
if (realm.isUserInRealmRole('marta', 'role-a')) {
$evaluation.grant();
}
或 为用户授予了客户端角色:
const realm = $evaluation.getRealm();
if (realm.isUserInClientRole('marta', 'my-client', 'some-client-role')) {
$evaluation.grant();
}
const realm = $evaluation.getRealm();
if (realm.isUserInClientRole('marta', 'my-client', 'some-client-role')) {
$evaluation.grant();
}
5.3.2.5. 检查授予组的角色 复制链接链接已复制到粘贴板!
检查授予组的域角色:
const realm = $evaluation.getRealm();
if (realm.isGroupInRole('/Group A/Group D', 'role-a')) {
$evaluation.grant();
}
const realm = $evaluation.getRealm();
if (realm.isGroupInRole('/Group A/Group D', 'role-a')) {
$evaluation.grant();
}
5.3.2.6. 将任意声明推送到资源服务器 复制链接链接已复制到粘贴板!
将任意声明推送到资源服务器,以提供有关如何强制实施权限的额外信息:
5.3.2.7. 检查组成员资格 复制链接链接已复制到粘贴板!
const realm = $evaluation.getRealm();
if (realm.isUserInGroup('marta', '/Group A/Group B')) {
$evaluation.grant();
}
const realm = $evaluation.getRealm();
if (realm.isUserInGroup('marta', '/Group A/Group B')) {
$evaluation.grant();
}
5.3.2.8. 混合不同的访问控制机制 复制链接链接已复制到粘贴板!
您还可以使用多种访问控制机制的组合。以下示例演示了如何在同一策略中使用角色(RBAC)和 claims/attributes (ABAC)检查。在这种情况下,我们将检查用户是否被授予了 admin 角色,还是来自 keycloak.org 域的电子邮件:
在编写自己的规则时,请记住 $evaluation 对象是实施 org.keycloak.authorization.policy.evaluation.Evaluation 的对象。有关可以从此接口访问的内容的更多信息,请参阅 评估 API。