使用<condition>和字符串比较

时间:2016-01-28 20:28:01

标签: authorization wso2is access-control xacml abac

参考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>

1 个答案:

答案 0 :(得分:1)

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

  • userCitizenship
  • allowedCitizenships

您可以执行以下操作:

案例#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. 案例#3

    • 这两个包都是多值的。

      以下是您的选择:

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

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