参考WSO2编辑器中<condition>
逻辑(true / false)的实现。为什么XACML版本3策略编辑器拒绝任何其他面向字符串的比较函数,除了使用&#34; urn:oasis:names:tc:xacml:1.0:function:string-is-in&#34; ?
示例:接受的语法
<Rule Effect="Deny" RuleId="Deny-Rule1">
<Target></Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-is-in">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
<AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.red.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
</Apply>
</Apply>
</Condition>
..
导致错误的语法示例:所有其他字符串比较函数,包括REGEX函数:
<Rule Effect="Deny" RuleId="Deny-Rule1">
<Target></Target>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
<Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:string-contains">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
<AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.red.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
</Apply>
</Apply>
</Condition>
..
目前的错误经常导致需要恢复从&#34; Deny&#34;效果&#34;许可&#34;效果,结合&#34;匹配&#34;逻辑,从开发人员的角度来看,不受欢迎,因为&#34; Deny&#34;规则用于具有更丰富的功能,如详细的ObligationExpressions用于错误处理。要应用<Condition>
语句,请在此情况下生成更全面的代码。
我很欣赏如何将<Condition>
语句与一般字符串比较函数一起使用,如:
. urn:oasis:names:tc:xacml:1.0:function:string-equal
. urn:oasis:names:tc:xacml:3.0:function:string-contains
. urn:oasis:names:tc:xacml:1.0:function:string-regexp-match
. urn:oasis:names:tc:xacml:3.0:function:string-equal-ignore-case
或其他生成布尔结果的String相关操作。
尝试使用ALFA实现相同的逻辑,这里是源:
namespace com.red.XACML {
import Attributes.*
import attributes.*
import com.red.XACML.Attributes.*
rule notBGroups {
deny
}
rule bGroupsCobMail {
target
condition
stringOneAndOnly(subjectAttributes.groupsUserBelong)=="myGroup"
permit
}
policy bGroups {
apply firstApplicable
bGroupsCobMail
notBGroups
}
}
这也会抛出与通过WSO2 Try-It功能相同的错误消息:
<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>urn:oasis:names:tc:xacml:1.0:function:string-one-and-only expects a bag that contains a single element, got a bag with 7 elements</StatusMessage>
</Status>
<Attributes Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject">
<Attribute AttributeId="urn:oasis:names:tc:xacml:1.0:subject:subject-id" IncludeInResult="true">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myname@red.com</AttributeValue>
</Attribute>
</Attributes>
</Result>
</Response>
看起来AttributeDesignator包需要另一个迭代循环才能解析元素。我们怎样才能做到这一点?
最新更新 在这里进入了一些圈子,由于WSO2 XML编辑器的语法拒绝而没有在测试中取得进展。
问题在于AttributeID&#34; http://w3.red.com/subject/groupsUserBelong&#34;的属性指示符。 返回七个元素的列表。七个元素反映了主题的所有数据,因此逻辑上7的值是有意义的。
我的逻辑如下:我已经定义了一个组名变量,实际上是一个类似&#34; myGroup&#34;的字符串,然后我需要迭代它的7个元素 LinkedPashSet从PIP返回,相关与否,并扫描每个元素,搜索模式(或单词),如&#34; myGroup&#34;。一旦找到 相等,布尔&#34;真&#34;被设定为结果。现在在条件的外部,我计划添加一个NOT函数来反转布尔状态,这样条件就会产生一个&#34; Deny&#34;如果没有找到该组,则通过此触发器触发具有详细错误消息的ObligationEpression。
看起来核心问题是如何迭代七个元素的列表以及如何在一个元素中找到单词,因为字符串子集是 没有找到这个词和其他功能是不被接受的。
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-one-and-only">
<AttributeDesignator Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" AttributeId="http://w3.ibm.com/subject/groupsUserBelong" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="false"></AttributeDesignator>
</Apply>
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
</Apply>
</Apply>
</Condition>
<Result>
<Decision>Indeterminate</Decision>
<Status>
<StatusCode Value="urn:oasis:names:tc:xacml:1.0:status:processing-error"/>
<StatusMessage>urn:oasis:names:tc:xacml:1.0:function:string-one-and-only expects a bag that contains a single element, got a bag with 7 elements</StatusMessage>
</Status>
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:not">
<!--Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-subset"-->
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-at-least-one-member-of">
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
</Apply>
<AttributeDesignator AttributeId="http://w3.ibm.com/subject/groupsUserBelong" Category="urn:oasis:names:tc:xacml:1.0:subject-category:access-subject" DataType="http://www.w3.org/2001/XMLSchema#string" MustBePresent="true"></AttributeDesignator>
</Apply>
</Apply>
</Condition>
<Result>
<Decision>Deny</Decision>
Conclusion: the condition did not find the group.
编辑通过此消息拒绝其他语法结构:
Entitlement policy is not updated. Error is :Unsupported Entitlement Policy. Policy can not be parsed
最新更新: 此行为看起来像WSO2策略XML编辑器中的错误。该工具未能支持:
A.3.12高阶包函数
例如:sample any-of-any
支持的逻辑请参阅: http://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html
可以使用以下条件模拟该问题&#34;条件&#34;陈述:
<Condition>
<Apply FunctionId="urn:oasis:names:tc:xacml:3.0:function:any-of-any">
<Function FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-equal"/>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
</Apply>
<Apply FunctionId="urn:oasis:names:tc:xacml:1.0:function:string-bag">
<AttributeValue DataType="http://www.w3.org/2001/XMLSchema#string">myGroup</AttributeValue>
</Apply>
</Apply>
</Condition>
答案 0 :(得分:1)
如果你想比较2个包,例如
您可以执行以下操作:
您可以使用stringOneAndOnly(userCitizenship)==stringOneAndOnly(allowedCitizenships)
(或反过来)
stringIsIn(stringOneAndOnly(userCitizenship), allowedCitizenships)
。 anyOf(function[stringEquals], allowedCitizenships, stringOneAndOnly(userCitizenship))
。这两个包都是多值的。
以下是您的选择:
stringAtLeastOneMemberOf(userCitizenship, allowedCitizenships)
。这个功能适用于包袋。AnyOfAny(function[stringEquals], userCitizenship, allowedCitizenships)
。您可以在XACML中使用更多高阶函数来实现您正在寻找的确切行为。