1:ALFA中的n个关系和复杂属性类型

时间:2018-05-23 09:46:00

标签: xacml abac alfa

我正在尝试将数据库模型输入ALFA,以检查ALFA和XACML的功能。

以下属性是否可能?那怎么看规则呢?

1:n按字符串列表

namespace com.mycompany {
   namespace resources {
       namespace patient {
                attribute trustedDoctorIds{
                    category = resourceCat
                    id = "trustedDoctorIds"
                    type = list<string> //maybe it should be bag[string]
                }                
       }
   }
}

1:n按复杂类型列表

namespace com.mycompany {
   namespace resources {
       namespace patient {
                attribute trustedDoctors{
                    category = resourceCat
                    id = "trustedDoctors"
                    type = list<doctor> //maybe it should be bag[doctor]
                } 
       }
   }

   namespace subjects {
      namespace doctor {
          attribute id {
                    category = subjectCat
                    id = "id"
                    type = string
          }
          attribute lastname {
                    category = subjectCat
                    id = "lastname"
                    type = string
          }
      }
   }
}

1 个答案:

答案 0 :(得分:1)

你有一个很好的问题。

默认情况下,ALFA和XACML中的所有属性都是多值的。属性是值的包而不是单个值。这意味着当您定义以下内容时,

            attribute trustedDoctorIds{
                category = resourceCat
                id = "trustedDoctorIds"
                type = string
            }     

这意味着该属性具有字符串类型,并且可以是多值的。您可以选择在属性定义上方的注释中表达基数信息,例如

/**
 * This attribute, trustedDoctorIds, contains the list of doctors a patient 
 *trusts. The list can have 0 or more values.
 */

该政策将根据所使用的功能传达可以有多少价值的政策。

例如,您可以编写一个陈述

的条件
stringOneAndOnly(trustedDoctorIds)==stringOneAndOnly(userId)

在这种情况下,您强制每个属性只有一个值和一个值。如果您的值为0或大于1,那么对XACML策略的评估将产生Indeterminate

在XACML(或ALFA)目标中,当你写:

trustedDoctorIds == "Joe"

您说:如果trustedDoctorIds中至少有一个值等于&#39; Joe&#39; ...

在ALFA条件下,当你写

trustedDoctorIds==userId

您说:*如果trustedDoctorIds中至少有一个值等于userId

中的至少一个值

注意:我尽可能使用单数名称作为属性。这是一个惯例,而不是硬性限制。记住属性的基数将有助于您的政策测试。

评论的答案

  

您试图通过惯例避免使用复数名称?

好受信任的医生我*** ***对我来说看起来很复杂。我会使用trustedDoctorId,除非您知道该属性必须始终是多值的。

  

所以,这应该是可能的:在我的请求中,我提供了resource.patient.trustedDoctorIds ==&#34; 2,13,67&#34;和subject.doctor.id ==&#34; 6&#34;。那么规则在ALFA中会是什么样子?水木清华。喜欢&#34; resource.patient.trustedDoctorIds.contains(subject.doctor.id)permit&#34;

规则如下所示:

stringIsIn(stringOneAndOnly(subject.doctor.id),resource.patient.trustedDoctorIds)

确保在请求中提供多个值,而不是一个包含逗号分隔值的值。发送[1,2,3]而不是&#34; 1,2,3&#34;。

进一步编辑

  

因此,在[2,13,67]中,结果是如预期的那样否定,并且不允许像&#34; 2,13,67&#34;和doctorId == 6。我故意选择了这个例子,因为stringIsIn函数会产生不必要的结果,因为67包含在67中

请勿混淆stringIsIn()stringContains()

  • stringIsIn(a, b)接受2个参数a和b,其中a是原子值,b是一包值。如果a的值在b的值包中,则stringIsIn(a, b)返回true。
  • stringContains(a, b)接受2个参数a和b,它们都是string类型的原子值。如果在b。
  • 中找到字符串值a,则返回true
例:
    如果用户的单一公民身份等同于瑞典语或德语,
  • stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))将返回true。
  • 如果第二个字符串包含第一个字符串,则
  • stringContains("a", "alfa")返回true。所以它在这个例子中返回true。