ABAC with keycloak - 在策略中使用Resource属性

时间:2016-10-24 12:42:30

标签: keycloak abac keycloak-services

我想要实现的目标

使用以下政策保护Keycloak中的资源:

<form #f="ngForm" (submit)="add(f.valid)" novalidate>
    <label>Name</label>
    <div>
        <input [(ngModel)]="name" name="name" #name="ngModel" required>
    </div>
    <div[hidden]="name.valid || (name.pristine && !f.submitted)">
        <small class="text-danger">Please input name</small>
    </div>
    <button type="submit">Save</button>
</form>

通过他们的官方documentsmailing list responses,似乎基于属性的访问控制是可能的,但是,我找不到让它工作的方法。

我尝试了什么

  • 使用Authorization Services:我无法弄清楚我可以从资源实例中注入属性的位置和方式。
  • 使用Authorization Context:我希望获得与资源和范围相关联的策略,以便我可以自己评估它们。

到目前为止,我已经设法在两种方法中都没有。说实话,我对授权服务中使用的术语感到不知所措。

问题 如何在keycloak中定义策略时使用资源实例的属性?

2 个答案:

答案 0 :(得分:2)

我通过创建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();
}

答案 1 :(得分: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();
}