3

浏览 OASIS XACML V3 规范,我没有发现任何对实现“字符串不等于”操作的逻辑函数 [此处] 的引用。缺少的功能是:

<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-not-equal">

问题:是否有省略此功能的原因,或者是否有通过代码修改允许规则分析师绕过这种情况的良好做法?

4

2 回答 2

5

简短的回答:没有。

XACML 中的函数及其使用

在 XACML 中,有些函数可以在目标内部使用,而函数只能在条件内部使用。

您可以在目标中使用的所有函数也可以在条件中使用,但反之则不然。

您可以在目标中使用的唯一功能是:

  • 只取 2 个参数,
  • 第一个参数必须是静态值
  • 第二个参数是一个属性。
  • 返回一个布尔值

例如stringEquals("manager", role)可以在目标内部使用。stringEquals是 的 ALFA 符号urn:oasis:names:tc:xacml:1.0:function:string-equal

这是示例目标的源代码。

  <xacml3:Target>
    <xacml3:AnyOf>
      <xacml3:AllOf>
        <xacml3:Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
          <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">manager</xacml3:AttributeValue>
          <xacml3:AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"  AttributeId="user.role" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"/>
        </xacml3:Match>
      </xacml3:AllOf>
    </xacml3:AnyOf>
  </xacml3:Target>

为什么没有字符串不相等?

首先要记住一个属性,例如角色实际上是一个值包。袋子可以是空的,有一个值,或者有更多。

当您编写 stringEquals("manager", role) 时,您真正想说的是,如果角色的值列表中至少有一个值等于值“manager”。换句话说,如果您既是经理又是设计师,您的政策/规则将适用。

现在与此相反的是什么?什么是 stringNotEquals("manager", role)?是否也至少有一个值不等于 manager ?那么在这种情况下,如果我是经理和设计师,那么我就不是经理。还是我?

因为默认情况下 XACML 认为所有属性都是多值的,所以不能有一个名为 stringNotEquals 的函数。

那么如何表达否定的情况呢?

但是,有一些方法可以解决这个问题。您可以在条件下表达否定情况,例如通过执行以下操作(使用 ALFA 表示法):

not ( stringEquals(stringOneAndOnly(role),"manager") )

生成的 XACML 是:

 <xacml3:Condition >
      <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
           <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
                <xacml3:Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
                     <xacml3:AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject"  AttributeId="user.role" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"/>
                </xacml3:Apply>
                <xacml3:AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">manager</xacml3:AttributeValue>
           </xacml3:Apply>
      </xacml3:Apply>
 </xacml3:Condition>

我希望这有帮助...

于 2015-11-25T03:24:52.700 回答
0

暂时,我通过将“Match”语句更改为基于 REGEX 的逻辑找到了一种绕过方法,该逻辑提供了一个实现:“Does not contain a word XYZ in a String”的函数,如以下示例所示:

 <!-- Not Equal operator executed by the REGEX -->  
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-regexp-match">
 <AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">^((?!XYZ).)*$</AttributeValue>

这段代码构造得不是很好,也不可读,但它提供了“不等于”所缺少的功能。请让我知道是否有更好的解决方案。

于 2015-11-18T16:02:53.113 回答