浏览 OASIS XACML V3 规范,我没有发现任何对实现“字符串不等于”操作的逻辑函数 [此处] 的引用。缺少的功能是:
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-not-equal">
问题:是否有省略此功能的原因,或者是否有通过代码修改允许规则分析师绕过这种情况的良好做法?
浏览 OASIS XACML V3 规范,我没有发现任何对实现“字符串不等于”操作的逻辑函数 [此处] 的引用。缺少的功能是:
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-not-equal">
问题:是否有省略此功能的原因,或者是否有通过代码修改允许规则分析师绕过这种情况的良好做法?
简短的回答:没有。
在 XACML 中,有些函数可以在目标内部使用,而函数只能在条件内部使用。
您可以在目标中使用的所有函数也可以在条件中使用,但反之则不然。
您可以在目标中使用的唯一功能是:
例如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>
我希望这有帮助...
暂时,我通过将“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>
这段代码构造得不是很好,也不可读,但它提供了“不等于”所缺少的功能。请让我知道是否有更好的解决方案。