ABAC与Keycloak - 在策略中使用资源属性

7
我想要实现的目标是:
使用类似以下策略的方式在Keycloak中保护一个资源:
if (resource.status == 'draft') $evaluation.grant(); 
else $evaluation.deny();

根据他们的官方文件和邮件列表回复,似乎基于属性的访问控制是可能的,然而,我找不到使其工作的方法。
我尝试过以下方法:
- 使用授权服务:我无法弄清楚在哪里以及如何注入资源实例中的属性。 - 使用授权上下文:我希望能够获取与资源和范围相关联的策略,以便我可以自己评估它们。
到目前为止,我在这两种方法中都没有取得任何进展。老实说,我被授权服务中使用的术语所淹没了。
如何在Keycloak中定义策略时使用资源实例的属性?

3
看起来这个功能将在 Keycloak 版本 4 中推出。已经可以在 4.0.0.Beta1 中使用(见 https://issues.jboss.org/browse/KEYCLOAK-6529)。虽然我自己没有尝试过。 - jadkik94
嗨,18版已经发布了,但是我仍然没有看到基于属性的策略,我错过了什么吗? - Kostanos
2个回答

6

我通过创建JavaScript策略在Keycloak 4.3中解决了这个问题,因为属性策略不存在(但有望出现)。以下是我成功运行的代码示例(请注意,属性值是一个列表,因此您必须与列表中的第一项进行比较):

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();
}

请问 status 属性的值是从哪里获取的?它是由客户端或后端设置的属性吗?如果是这样,您如何将此类信息作为资源属性从客户端/后端转发? - Blink
嗨,戴夫,我知道这很老旧,但我也遇到了同样的问题。你是如何获得状态属性的? - NumeroUno
资源属性可以在资源定义期间进行定义,可以手动完成,也可以由资源所有者通过资源API完成。在这种方法中,资源应该实际上代表您的业务对象的一个实例,而不是它的类型(如果需要,可能会使用keycloak的资源类型属性进行通用类型级别的权限),当然,您还需要保持任何自定义资源属性与其真实来源(即资源所有者)的任何更改同步。请参阅https://www.keycloak.org/docs/latest/authorization_services/#_service_protection_api - Hesham Saleh

1

目前没有办法做到你想要的。ResourceRepresentation类只有(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();
}

你能详细说明如何在运行时设置上下文属性吗?我在 https://www.keycloak.org/docs/latest/authorization_services/#_service_obtaining_permissions 中没有找到设置它的参数。 - HFX

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接