1

首先用户可以同时拥有多个角色,并且角色具有作用域。例如,一个用户具有三个角色:/scopeA/editor、/scopeA/programmer、/scopeB/editor

并且 /scopeA/editor 可以访问资源 /scopeA/post /scopeA/programmer 可以访问资源 /scopeA/bug

/scopeB/editor has access to resource /scopeB/post

所以问题来了:

我如何声明一个策略说:如果角色包中有一个名为“/XX/editor”的角色,那么当“XX == YY”时,相应的用户可以访问“/YY/post”

我在这里找到了一个类似的问题,我提出了一个解决问题的方法,但是当涉及到多个角色(角色属性值是一个包)时,我的答案是不对的。因为角色属性值是一个包,我不能只获取角色属性值的前两个斜杠之间的部分,然后与资源属性进行比较,

然后我试图找到一个高阶包函数来做到这一点,“urn:oasis:names:tc:xacml:3.0:function:any-of”函数可以做到这一点,但是第一个“函数参数”呢任何功能?

这是我所做的:any-of 函数的第一个参数是“string-equal”,第二个参数是用于获取资源 ID 的前两个斜杠之间的部分的函数,第三个参数是主题的属性值是一个袋子。

所以我需要做的就是定义一个函数来获取前两个斜线之间的部分,对吗?

有没有更好的方法来做我想做的事?有什么不清楚的请告诉我,谢谢~~

4

1 回答 1

1

这是一个很好的问题。我们将此问题称为关系挑战的属性。本质上,用户在您所称的给定上下文或范围内具有角色。

如果我仅根据用户的身份从数据库中读取用户的角色,那么我将获得独立于范围的角色列表,例如编辑器、发布者、审阅者......

这将导致我有可能在我拥有正确角色的范围之外编辑帖子。

有几种方法可以解决这个问题。一种方法是在您的策略信息点中定义更严格的映射。

使用策略信息点

假设 XACML 请求说:“ Alice 可以编辑帖子 123 吗? ”。您的政策将声明(在 ALFA 语法中):

policy editPost{
    target clause resourceType=="post" and actionId=="edit"
    apply firstApplicable
    rule allowEditors{
        target clause userRole=="editor"
        permit
    }
}

范围的概念没有直接出现在策略中。到属性源的底层映射如下:

  • 使用SELECT role FROM usersRoleAssignment WHERE uid=?将 userRole 映射到表 usersRoleAssignment 的字段角色 和范围=?
    • uid 将映射到 XACML 请求中的用户身份。
    • 范围将是一个资源属性,也将在 PIP 中映射如下
  • 使用SELECT scope FROM posts WHERE pid=?将范围映射到表帖子的字段范围
    • pid 将被映射到相关帖子的标识符。这也出现在 XACML 请求中。

这意味着您的属性userRole应该真正称为scopedUserRole。我给出的模型只是一个例子。您可以通过其他几种方式进行建模,以获得相同的效果。无论哪种方式,所有繁重的工作都发生在 PIP 内部。主要缺点是您失去了对授权逻辑语义的可见性。

使用属性值和函数

实现类似结果的另一种方法是将范围和角色之间的关系存储在值本身中。这就是你在问题中提到的。

您可以使用 string-starts-with 或 string-ends-with 或 string-contains 等字符串函数来实现您感兴趣的内容。您还可以使用 string-regexp-match 函数。

有关函数的详细信息,请参见XACML 3.0 规范

如果 XACML 中的功能不够用,您可以:

  • 实现你自己的
  • 实现一个可以处理您的属性值并生成新属性值的 PIP。更多关于 PIP 的信息在这里

创建一个名为 tuple 的新数据类型

XACML 的问题在于它使关系扁平化。使用具有多个部分的新数据类型,即元组,将解决该问题。不过,这需要自定义编码和相当多的工作。

在 XACML 请求中使用 XML 内容

如果所有信息都来自 XACML 请求,那么它可以表示为 XML 有效负载,作为<Content/>XACML 请求内元素的一部分。然后,您可以使用属性选择器和 XPath 来检索您感兴趣的内容。

HTH。请查看我的博客Axiomatics 博客以获取更多提示。

于 2014-12-30T11:58:45.613 回答