扫描OASIS XACML V3规范我没有找到任何对实现“String-not-equal”操作的逻辑函数[here]的引用。缺少的功能是:
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-not-equal">
问题:是否有理由省略此功能,或者通过代码修改是否有良好的做法允许规则分析师绕过这种情况?
答案 0 :(得分:4)
简答:否。
在XACML中,有些函数可以在目标和函数中使用,只能在条件内使用。
您可以在目标中使用的所有功能也可以在条件中使用,但相反的情况并非如此。
您可以在目标中使用的唯一功能是:
例如,stringEquals("manager", role)
可以在Target中使用。 stringEquals
是urn: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”提供了缺失的功能。请让我知道有一个更好的解决方案。