0

参考<condition>WSO2 编辑器中逻辑(真/假)的实现。为什么 XACML 版本 3 策略编辑器拒绝任何其他面向字符串的比较函数,除了使用 "urn:oasis:names:tc:xacml:1.0:function:string-is-in" ?

示例:接受的语法

<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>
          .. 

当前的错误通常导致需要将一般策略方案从“拒绝”效果转变为“允许”效果,并结合“匹配”逻辑,从开发人员的角度来看这是不受欢迎的,因为“拒绝” " 规则用于具有更丰富的功能,例如用于错误处理的详细的 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

或其他生成布尔结果的字符串相关操作。

尝试使用 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“ http://w3.red.com/subject/groupsUserBelong ”的属性指示符返回一个包含七个元素的列表。这七个元素反映了该主题的所有数据,因此从逻辑上讲,7 的值是有意义的。

我的逻辑如下:我定义了一个组名变量,确实是一个像“myGroup”这样的字符串,然后我需要迭代从 PIP 返回的 LinkedHashSet 的 7 个元素,相关与否,并扫描每个元素搜索像“myGroup”这样的模式(或单词)。一旦发现相等,布尔值“true”被设置为结果。现在在条件的外部,我计划添加一个 NOT 函数来反转布尔状态,因此条件将生成一个“拒绝”的情况,即未找到该组,由此触发带有详细错误消息的 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 高阶包函数

例如:任意样例

有关支持的逻辑,请参见: http ://docs.oasis-open.org/xacml/3.0/xacml-3.0-core-spec-os-en.html

可以使用以下“条件”语句模拟该问题:

<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>
4

1 回答 1

2

如果您想比较 2 个包,例如

  • 用户公民身份
  • 允许的公民身份

您可以执行以下操作:

情况1

  • userCitizenship 是单值的
  • allowedCitizenships 是单值的

您可以使用stringOneAndOnly(userCitizenship)==stringOneAndOnly(allowedCitizenships)

案例#2

  • userCitizenship 是单值的
  • allowedCitizenships 是多值的

(或反过来)

  1. 您可以使用stringIsIn(stringOneAndOnly(userCitizenship), allowedCitizenships).
  2. 您还可以使用高阶函数,例如 anyOf 或 allOf,如下所示anyOf(function[stringEquals], allowedCitizenships, stringOneAndOnly(userCitizenship))

案例#3

  • 这两个包都是多价值的。

    以下是您的选择:

    1. 您可以使用stringAtLeastOneMemberOf(userCitizenship, allowedCitizenships). 此功能适用于包。
    2. 您可以使用高阶函数AnyOfAny(function[stringEquals], userCitizenship, allowedCitizenships)

您可以在 XACML 中使用更多高阶函数来实现您正在寻找的确切行为。

于 2016-01-29T22:20:42.683 回答