[英]Does XACML implement a “NOT EQUAL” function?
掃描通過OASIS XACML V3規范我沒有找到一個邏輯功能[任何參考這里 ]實現一個“串不等於”操作。 缺少的功能是:
<Match MatchId="urn:oasis:names:tc:xacml:1.0:function:string-not-equal">
問題:是否有理由省略此功能,或者是否有通過代碼修改使規則分析師繞過這種情況的良好實踐?
簡短的回答:不。
在XACML中,有些函數可以在目標內部使用,而某些函數只能在內部條件使用。
您可以在目標中使用的所有功能也可以在條件中使用,但事實並非如此。
您可以在目標中使用的唯一功能是:
例如stringEquals("manager", role)
可以在目標內部使用stringEquals("manager", role)
。 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(“ manager”,role)時,您真正要說的是角色的值列表中至少有一個等於“ manager”值的值。 換句話說,如果您既是經理又是設計師,那么您的政策/規則將適用。
現在相反嗎? 什么是stringNotEquals(“ manager”,role)? 是否還會存在至少一個不等於管理者的值? 那么在那種情況下,如果我是經理和設計師,那么我就不是經理。 還是我
因為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的邏輯來發現了一個旁路,該邏輯提供了實現以下功能的函數:“在字符串中不包含單詞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”所缺少的功能。 請讓我知道有更好的解決方案。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.