我正在尝试将数据库模型输入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
}
}
}
}
答案 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。stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))
将返回true。stringContains("a", "alfa")
返回true。所以它在这个例子中返回true。