【问题标题】:Is it possible to compare attributes in a XACML policy?是否可以比较 XACML 策略中的属性?
【发布时间】:2014-12-03 15:23:04
【问题描述】:

以下规则表明角色为“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

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

【问题讨论】:

    标签: authorization access-control xacml xacml3 xacml2


    【解决方案1】:

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

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

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

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

    【讨论】:

      【解决方案2】:

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

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

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

      【讨论】:

      • 您是否找到了最佳实践来做您想做的事?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-12-20
      • 2019-08-11
      • 1970-01-01
      • 2012-09-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多