带有 keycloak 的 ABAC - 在策略中使用资源属性
ABAC with keycloak - Using Resource attributes in policy
我想要达到的目标
使用如下策略保护 Keycloak 中的资源:
if (resource.status == 'draft') $evaluation.grant();
else $evaluation.deny();
根据他们的官方 documents and mailing list responses,基于属性的访问控制似乎是可行的,但是,我找不到让它工作的方法。
我试过的
- 使用Authorization Services:我无法弄清楚在哪里以及如何从资源实例中注入属性。
- 使用 Authorization Context:我希望获得与资源和范围关联的策略,以便我可以自行评估它们。
到目前为止,我对这两种方法都一无所获。老实说,授权服务中使用的术语让我不知所措。
问题
在 keycloak 中定义策略时如何使用资源实例的属性?
目前没有办法做你想做的事。 ResourceRepresentation class 只有 (id, name, uri, type, iconUri, owner) 字段。因此,您可以使用所有者来确定每个 Keycloak 示例的所有权。我已经看到一个讨论添加额外资源属性的线程,但还没有看到它的 Keycloak JIRA。
也许您可以通过在运行时设置您需要的内容并围绕它编写策略来以某种方式使用上下文属性。
var context = $evaluation.getContext();
var attributes = context.getAttributes();
var fooValue = attributes.getValue("fooAttribute");
if (fooValue.equals("something"))
{
$evaluation.grant();
}
我在 Keycloak 4.3 中通过创建 JavaScript 策略解决了这个问题,因为属性策略(目前)还不存在。这是我开始工作的代码示例(请注意,属性值是一个列表,因此您必须与列表中的第一项进行比较):
var permission = $evaluation.getPermission();
var resource = permission.getResource();
var attributes = resource.getAttributes();
if (attributes.status !== null && attributes.status[0] == "draft") {
$evaluation.grant();
} else {
$evaluation.deny();
}
我想要达到的目标
使用如下策略保护 Keycloak 中的资源:
if (resource.status == 'draft') $evaluation.grant();
else $evaluation.deny();
根据他们的官方 documents and mailing list responses,基于属性的访问控制似乎是可行的,但是,我找不到让它工作的方法。
我试过的
- 使用Authorization Services:我无法弄清楚在哪里以及如何从资源实例中注入属性。
- 使用 Authorization Context:我希望获得与资源和范围关联的策略,以便我可以自行评估它们。
到目前为止,我对这两种方法都一无所获。老实说,授权服务中使用的术语让我不知所措。
问题 在 keycloak 中定义策略时如何使用资源实例的属性?
目前没有办法做你想做的事。 ResourceRepresentation class 只有 (id, name, uri, type, iconUri, owner) 字段。因此,您可以使用所有者来确定每个 Keycloak 示例的所有权。我已经看到一个讨论添加额外资源属性的线程,但还没有看到它的 Keycloak JIRA。
也许您可以通过在运行时设置您需要的内容并围绕它编写策略来以某种方式使用上下文属性。
var context = $evaluation.getContext();
var attributes = context.getAttributes();
var fooValue = attributes.getValue("fooAttribute");
if (fooValue.equals("something"))
{
$evaluation.grant();
}
我在 Keycloak 4.3 中通过创建 JavaScript 策略解决了这个问题,因为属性策略(目前)还不存在。这是我开始工作的代码示例(请注意,属性值是一个列表,因此您必须与列表中的第一项进行比较):
var permission = $evaluation.getPermission();
var resource = permission.getResource();
var attributes = resource.getAttributes();
if (attributes.status !== null && attributes.status[0] == "draft") {
$evaluation.grant();
} else {
$evaluation.deny();
}