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 中使用。 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>
为什么没有字符串不相等?
首先记住一个属性,例如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>
希望对您有所帮助...
浏览 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 中使用。 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>
为什么没有字符串不相等?
首先记住一个属性,例如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>
希望对您有所帮助...