首先,用户可以同时拥有多个角色,角色具有范围。例如, 一个用户有三个角色:/ scopeA / editor,/ scopeA / programmer,/ scopeB / editor
和/ scopeA / editor可以访问resource / scopeA / post / scopeA / programmer可以访问resource / scopeA / bug
/scopeB/editor has access to resource /scopeB/post
所以问题来了:
如何声明策略说:如果角色包中有一个名为“/ XX / editor”的角色,那么相应的用户可以访问“/ YY / post”,当“XX == YY”时< / p>
我发现了一个类似的问题here,我提出了解决问题的方法,但是当谈到多个角色(角色属性值是一个包)时,我的答案是不正确的。因为角色属性值是一个包,所以我不能只获取角色属性值的前两个斜杠之间的部分,并与资源属性的斜杠进行比较,
然后我试图找到一个更高阶的包函数来做到这一点,“urn:oasis:names:tc:xacml:3.0:function:any-of”函数可以做到这一点,但是第一个“函数怎么样?任何一个函数的论证?
这就是我所做的:any-of function的第一个参数是“string-equal”,第二个参数是一个函数,用于获取resouce-id的前两个斜杠之间的部分,第三个参数argument是主题的属性值,是一个包。
所以我需要做的就是定义一个函数来获取前两个斜杠之间的部分,对吗?
有没有更好的方法来做我想要的?如果有什么不清楚,请告诉我,谢谢~~
答案 0 :(得分:1)
这是一个很好的问题。我们将此问题称为关系挑战的属性。从本质上讲,用户在您调用它时在给定的上下文或范围内具有角色。
如果我仅根据用户的身份从数据库中读取用户的角色,那么我将独立于范围取回角色列表,例如编辑,出版商,评论家......
这会导致我可以编辑一个我在正确角色范围之外的帖子的风险。
有几种方法可以解决这个问题。一种方法是在策略信息点中定义更严格的映射。
假设XACML请求说:&#34; Alice可以编辑帖子123吗?&#34;。您的策略将声明(使用ALFA语法):
policy editPost{
target clause resourceType=="post" and actionId=="edit"
apply firstApplicable
rule allowEditors{
target clause userRole=="editor"
permit
}
}
范围的概念并未直接显示在政策中。对属性源的底层映射如下:
这意味着你的属性 userRole 应该被称为 scopedUserRole 。我给出的建模只是一个例子。您还可以使用其他几种方法进行相同的效果建模。无论哪种方式,所有繁重的工作都发生在PIP内部。主要缺点是您无法看到授权逻辑的语义。
实现类似结果的另一种方法是将范围和角色之间的关系存储在值本身中。这是你在问题中提到的。
您可以使用字符串函数(如string-starts-with或string-ends-with或string-contains)来实现您感兴趣的内容。您还可以使用字符串 - 正则表达式匹配函数。
有关功能的详细信息,请参阅XACML 3.0 specification。
如果XACML中的功能不足,您可以:
XACML的问题在于它会使关系变得平坦。使用具有多个部分的新数据类型(即元组)将解决该问题。这需要自定义编码,但也有一些工作。
如果所有信息都来自XACML请求,那么它可以表示为XML有效负载,作为XACML请求中<Content/>
元素的一部分。然后,您可以使用属性选择器和XPath来检索您感兴趣的内容。
HTH。请查看my blog和Axiomatics blog以获取更多提示。