带有 keycloak 的 ABAC - 在策略中使用资源属性

Posted

技术标签:

【中文标题】带有 keycloak 的 ABAC - 在策略中使用资源属性【英文标题】:ABAC with keycloak - Using Resource attributes in policy 【发布时间】:2017-03-06 06:00:43 【问题描述】:

我正在努力实现的目标

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

if (resource.status == 'draft') $evaluation.grant(); 
else $evaluation.deny();

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

我的尝试

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

到目前为止,这两种方法我都没有成功。老实说,我对授权服务中使用的术语感到不知所措。

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

【问题讨论】:

看起来这将出现在 Keycloak 版本 4 中。已经在 4.0.0.Beta1 中可用(请参阅 issues.jboss.org/browse/KEYCLOAK-6529)。虽然我自己没有尝试过 【参考方案1】:

我在 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();

【讨论】:

您能否澄清status 属性值的来源?它是由请求访问它的客户端或后端以某种方式设置的属性吗?如果是这样,您如何将这种来自客户端/后端的信息作为资源属性转发? 嗨戴夫,我知道它很旧,但我也面临同样的问题。你是怎么得到status属性的? 资源属性可以在资源定义期间定义,可以手动完成,也可以由资源所有者通过资源 API 完成。在这种方法中,资源实际上应该代表您的业务对象的一个​​实例,而不是它的类型(如果需要,可能使用 keycloak 的资源类型属性来获得通用类型级别的权限),当然您还需要保留任何自定义资源属性与真实来源(即资源所有者)的任何更改同步。见keycloak.org/docs/latest/authorization_services/…【参考方案2】:

目前没有办法做你想做的事。 ResourceRepresentation 类只有 (id, name, uri, type, iconUri, owner) 字段。因此,您可以使用 owner 来确定每个 Keycloak 示例的所有权。我见过一个讨论添加额外资源属性的线程,但还没有看到它的 Keycloak JIRA。

也许您可以通过在运行时设置所需内容并围绕它编写策略来以某种方式使用上下文属性。

var context = $evaluation.getContext();
var attributes = context.getAttributes();
var fooValue = attributes.getValue("fooAttribute");

if (fooValue.equals("something")) 

   $evaluation.grant();

【讨论】:

能否详细说明如何在运行时设置上下文属性?我没有找到将其设置为keycloak.org/docs/latest/authorization_services/… 的参数

以上是关于带有 keycloak 的 ABAC - 在策略中使用资源属性的主要内容,如果未能解决你的问题,请参考以下文章

带有嵌入式 keycloak 和 spring boot 应用程序的默认配置

钥匙斗篷 |如何添加自定义 keycloak 密码策略?

Keycloak |如何添加自定义密钥泄露密码策略?

我们如何在 Keycloak 授权服务策略中为所有用户分配权限?

如何使 Spring Boot 适配器中的 Keycloak 策略执行器与 vaadin 一起使用

无法使用 Keycloak 评估基于 Javascript 的策略