XACML 是否实现了“NOT EQUAL”功能?

Does XACML implement a “NOT EQUAL” function?

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

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

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

暂时,我通过将 "Match" 语句更改为基于 REGEX 的逻辑找到了一种绕过方法,该逻辑提供了一个函数,该函数实现了:“字符串中不包含单词 XYZ”,如本例所示:

 <!-- 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>

此代码构造得不是很好,也不可读,但它提供了 "NOT EQUAL" 缺少的功能。如果有更好的解决方案,请告诉我。

简答:没有。

XACML 中的函数及其使用

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

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

您可以在目标中使用的唯一函数是:

  • 只接受 2 个参数,
  • 第一个参数必须是静态值
  • 第二个参数是一个属性。
  • return 布尔值

例如 stringEquals("manager", role) 可以在 Target 中使用。 stringEqualsurn:oasis:names:tc:xacml:1.0:function:string-equal 的 ALFA 表示法。

这里是示例 Target 的源代码。

  <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>

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

首先记住一个属性,例如role 实际上是一袋值。袋子可以是空的,可以有一个值,也可以有多个值。

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

现在它的反面是什么?什么是 stringNotEquals("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>

希望对您有所帮助...