3

以下规则表明角色为“acme_manager”的主体可以对资源“/acme/widgets”执行任何操作:

<Rule Effect="Permit" RuleId="PermitRule">
      <Condition>
         <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:and">
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">/acme/widgets</AttributeValue>
               <AttributeDesignator AttributeId="urn:oasis:names:tc:xacml:1.0:resource:resource-id" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
            </Apply>
            <Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
               <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">acme_manager</AttributeValue>
               <AttributeDesignator AttributeId="http://wso2.org/claims/role" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"/>
            </Apply>
         </Apply>
      </Condition>
   </Rule>

是否可以创建一个更动态的规则,例如:“如果 X 等于 Y,具有 X_manager 角色的主题可以对资源 /Y/widgets 执行任何操作”

所以我可以使用相同的策略来执行:

  • foo_manager ... /foo/widgets
  • bar_manager ... /bar/widgets
  • baz_manager ... /baz/widgets
  • 等等

无需创建多个类似的策略。

4

2 回答 2

2

是的,当然,这实际上是 XACML 相对于其他授权框架的主要优势之一,而且绝对是 RBAC。

在 XACML 中,您可以使用 2 个元素来定义授权的适用性。这些是:

  • XACML目标
    • 目标存在于策略集元素、策略元素和规则元素中。
    • 目标用于属性和值之间的简单匹配,例如 role=="manager"
  • XACML条件:条件仅存在于规则元素中。
    • 条件适用于任何类型的匹配,包括您正在寻找的匹配。使用条件,您可以比较任意数量的属性,例如 userDepartment==resourceDepartment。

我建议您使用ALFA来编写您的策略。它比普通的旧 XACML 容易得多。ALFA 是 Axiomatics 开发的免费工具(免责声明:我为 Axiomatics 工作)。它也在 OASIS XACML 技术委员会进行标准化。

于 2014-03-20T17:37:08.250 回答
0

我认为有两种方法可以做到这一点:

  1. 在您的策略中定义两个“VariableDefinition”:一个获取下划线字符之前的部分,另一个获取最后两个斜杠字符之间的部分。[我想知道XACML的核心规范是否定义了这样的功能]那么你可以使用“规则”下的两个“VariableDefinition”。然后使用标准的字符串相等函数来比较它们。

  2. 只需定义您自己的新功能,并将其添加到您的 PDP 使用的 FunctionFactory 中。这两种方法是相同的,您需要在某些属性上应用指定的功能,而不是直接使用原始属性值。

于 2014-12-03T07:23:04.553 回答