1

我不知道如何编写可以解决此要求的规则:

假设我有这个请求:

<Request>
  <Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>B</CategoryValue>
          <CategoryValue>C</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>B</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
  <Attributes Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource">
    <Content>
      <Categories>
        <Category name="cat1">
          <CategoryValue>A</CategoryValue>
        </Category>
        <Category name="cat2">
          <CategoryValue>A</CategoryValue>
          <CategoryValue>E</CategoryValue>
          <CategoryValue>F</CategoryValue>
          <CategoryValue>G</CategoryValue>
        </Category>
      </Categories>
    </Content>
  </Attributes>
</Request>

我想编写一个包含具有Permit效果的规则的策略,当对于Category资源的每个元素,主题具有Category相同的@name 并且这两个Category元素都具有至少一个 common 时CategoryValue

在上面的这个例子中:

  • 资源有“cat1”和“A” - 主题有“cat1”,其中一个值为 A:允许
  • 资源有“cat2”和“A”、“E”、“F”、“G” - 主题有“cat2”,值为 E(或 F):允许
  • 规则的最终结果:允许

我的问题不是functionId我应该使用哪个,而是如何结合这些条件以使规则按照我描述的方式运行?如何比较GenericValue具有相同节点的元素@name

我想我将不得不string-at-least-one-member-of在主题和资源“cat1”的值之间使用函数,然后在主题和资源“cat2”之间使用函数,但真正的困难是 PDP 不知道元素的值,所以@nameCategory不能直接在规则中对其进行硬编码,我不知道如何特别选择它们来执行检查。

对此有任何想法吗?

4

1 回答 1

0

首先,您的请求无效。您缺少一些元素,例如

  • ReturnPolicyIdList="true"
  • 组合决策=“真”

其次,我建议您不要在 XACML 中使用 XPath。它使您的策略难以编写(因此您的问题)、难以维护和难以阅读(审计)。它在某种程度上违背了 XACML 的目的。让 PEP 执行繁重的 XML 处理并发送带有属性值的属性而不是 XML 内容。

此外,您无法控制 XACML 中 XML 中不同元素/属性值的迭代。我可以用一个特定的值来实现你的用例,@name但我无法通过一组值来实现它。

假设单个值,您将必须实现如下条件:

<xacml3:Rule RuleId="axiomatics-example-xacml30" Effect="Permit" xmlns:xacml3="urn:oasis:names:tc:xacml:3.0:core:schema:wd-17">
     <xacml3:Target/>
     <xacml3:Condition >
          <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of">
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"/>
               <xacml3:AttributeSelector Path="/Categories/Category[@name='cat1']/CategoryValue/text()" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false" Category="urn:oasis:names:tc:xacml:3.0:attribute-category:resource"/>
          </xacml3:Apply>
     </xacml3:Condition>
</xacml3:Rule>

但是你不能真正迭代不同的值

于 2016-03-02T03:58:44.400 回答