У вас есть отличный вопрос.
По умолчанию все атрибуты в 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"
Вы говорите: если есть хотя бы одно значение в trustDoctorIds, равное 'Joe' ...
В состоянии ALFA, когда вы пишете
trustedDoctorIds==userId
Вы говорите: * если хотя бы одно значение в trustedDoctorIds
равно хотя бы одному значению в userId
Примечание: я всегда использую сингулярные имена для своих атрибутов, когда могу.Это соглашение, а не жесткий предел.Запоминание мощности ваших атрибутов поможет позже в тестировании вашей политики.
Ответы на комментарии
Какое имя во множественном числе вы стараетесь избегать по соглашению?
Хорошо доверенный DoctorId *** s *** выглядит для меня во множественном числе.Я бы использовал trustedDoctorId
, если вы не знаете, что атрибут обязательно всегда многозначный.
Итак, это должно быть возможно: в моем запросе я предоставляю resource.patient.trustedDoctorIds == "2,13,67 "и subject.doctor.id ==" 6 ".Как бы тогда выглядело правило в ALFA?Что-л.например, «resource.patient.trustedDoctorIds.contains (subject.doctor.id) разрешение»
Правило будет выглядеть следующим образом:
stringIsIn(stringOneAndOnly(subject.doctor.id),resource.patient.trustedDoctorIds)
Убедитесь, что вы указали несколькозначения в вашем запросе, а не одно значение, которое содержит значения, разделенные запятыми.Отправьте в [1,2,3] вместо «1,2,3».
Дальнейшие правки
Итак, по [2,13,67] результат отрицаетсякак и ожидалось и не разрешено, как с "2,13,67" и doctorId == 6Я выбрал этот пример нарочно, поскольку функция stringIsIn может привести к нежелательному результату с true, поскольку 6 включено в 67
Не путайте stringIsIn()
и stringContains()
.
stringIsIn(a, b)
принимает 2 параметра a и b, где a - атомное значение, а b - пакет значений.stringIsIn(a, b)
возвращает true, если значение a находится в сумке значений b. stringContains(a, b)
принимает 2 параметра a и b, которые оба являются атомарными значениями типа string.Он возвращает true, если строковое значение a находится внутри b.
Пример:
stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))
возвращает true, если пользователь имеет одно гражданство, равное шведскому или немецкому. stringContains("a", "alfa")
возвращает true, если вторая строка содержит первую.Таким образом, в этом примере возвращается true.