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

时间:2015-11-18 16:02:53

标签: authorization access-control xacml xacml3 abac

扫描OASIS XACML V3规范我没有找到任何对实现“String-not-equal”操作的逻辑函数[here]的引用。缺少的功能是:

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

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

2 个答案:

答案 0 :(得分:4)

简答:否。

XACML中的函数及其使用

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

您可以在目标中使用的所有功能也可以在条件中使用,但相反的情况并非如此。

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

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

例如,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>

为什么不存在字符串不相等?

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

当你编写stringEquals(&#34; manager&#34;,role)时,你真正要说的是,如果角色的值列表中至少有一个值等于值&#34;管理器&#34 ;.换句话说,如果您既是经理又是设计师,则适用您的保单/规则。

现在恰恰相反?什么是stringNotEquals(&#34;经理&#34;,角色)?是否还有至少一个不等于经理的价值?那么在这种情况下,如果我是经理和设计师,那么我不是经理。还是我?

因为默认情况下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>

我希望这会有所帮助......

答案 1 :(得分:0)

暂时,我通过将“匹配”语句更改为基于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”提供了缺失的功能。请让我知道有一个更好的解决方案。