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 tr​​ustedDoctorId***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 是真的。