1:n ALFA 中的关系和复杂属性类型
1:n relationships and complex attribute types in 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
}
}
}
}
你问得好。
默认情况下,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 中至少有一个值等于 'Joe'...
在 ALFA 条件下,当你写
trustedDoctorIds==userId
你是说:*如果 trustedDoctorIds
中至少有一个值等于 userId
中至少有一个值
注意:我总是尽可能为我的属性使用单数名称。这是约定,不是硬性限制。记住属性的基数将有助于稍后的策略测试。
回复评论
What would be a plural name you try to avoid by your convention?
Well trustedDoctorId***s*** 对我来说看起来很复数。我会使用 trustedDoctorId
除非你知道属性必然总是多值的。
So, this should be possible: In my request I provide resource.patient.trustedDoctorIds=="2,13,67" and subject.doctor.id=="6". How would the rule then look like in ALFA? Smth. like "resource.patient.trustedDoctorIds.contains(subject.doctor.id) permit"
规则如下所示:
stringIsIn(stringOneAndOnly(subject.doctor.id),resource.patient.trustedDoctorIds)
确保您在请求中提供多个值,而不是一个包含逗号分隔值的值。发送 [1,2,3] 而不是“1,2,3”。
进一步编辑
So, by [2,13,67] the result is deny as expected and not permit like with "2,13,67" and doctorId==6. I chose that example on purpose, since the stringIsIn function would result unwantedly with true since 6 is included in 67
不要混淆 stringIsIn()
和 stringContains()
。
stringIsIn(a, b)
接受 2 个参数 a 和 b,其中 a 是一个原子值,b 是一袋值。 stringIsIn(a, b)
returns 如果 a 的值在 b 的值中则为真。
stringContains(a, b)
接受 2 个参数 a 和 b,它们都是字符串类型的原子值。如果在 b 中找到字符串值 a,则 returns 为真。
例子:
stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))
returns 如果用户拥有瑞典或德国的单一国籍,则为真。
stringContains("a", "alfa")
returns 如果第二个字符串包含第一个字符串则为真。所以在这个例子中 returns 是真的。
我正在尝试将我们的数据库模型输入 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
}
}
}
}
你问得好。
默认情况下,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 中至少有一个值等于 'Joe'...
在 ALFA 条件下,当你写
trustedDoctorIds==userId
你是说:*如果 trustedDoctorIds
中至少有一个值等于 userId
注意:我总是尽可能为我的属性使用单数名称。这是约定,不是硬性限制。记住属性的基数将有助于稍后的策略测试。
回复评论
What would be a plural name you try to avoid by your convention?
Well trustedDoctorId***s*** 对我来说看起来很复数。我会使用 trustedDoctorId
除非你知道属性必然总是多值的。
So, this should be possible: In my request I provide resource.patient.trustedDoctorIds=="2,13,67" and subject.doctor.id=="6". How would the rule then look like in ALFA? Smth. like "resource.patient.trustedDoctorIds.contains(subject.doctor.id) permit"
规则如下所示:
stringIsIn(stringOneAndOnly(subject.doctor.id),resource.patient.trustedDoctorIds)
确保您在请求中提供多个值,而不是一个包含逗号分隔值的值。发送 [1,2,3] 而不是“1,2,3”。
进一步编辑
So, by [2,13,67] the result is deny as expected and not permit like with "2,13,67" and doctorId==6. I chose that example on purpose, since the stringIsIn function would result unwantedly with true since 6 is included in 67
不要混淆 stringIsIn()
和 stringContains()
。
stringIsIn(a, b)
接受 2 个参数 a 和 b,其中 a 是一个原子值,b 是一袋值。stringIsIn(a, b)
returns 如果 a 的值在 b 的值中则为真。stringContains(a, b)
接受 2 个参数 a 和 b,它们都是字符串类型的原子值。如果在 b 中找到字符串值 a,则 returns 为真。
stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))
returns 如果用户拥有瑞典或德国的单一国籍,则为真。stringContains("a", "alfa")
returns 如果第二个字符串包含第一个字符串则为真。所以在这个例子中 returns 是真的。