У вас есть отличный вопрос.
По умолчанию все атрибуты в 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, равное "Джо"...
В состоянии АЛЬФА, когда вы пишете
trustedDoctorIds==userId
Вы говорите: *если хотя бы одно значение в trustedDoctorIds
равно хотя бы одному значению в userId
Примечание. Я всегда использую имена в единственном числе для своих атрибутов, когда это возможно. Это условность, а не жесткое ограничение. Запоминание кардинальности ваших атрибутов поможет позже при тестировании политики.
Ответы на комментарии
Какое имя во множественном числе вы стараетесь избегать по вашему соглашению?
Ну, trustDoctorId***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, которые являются атомарными значениями строкового типа. Он возвращает true, если строковое значение a находится внутри b.
Example:
stringIsIn(stringOneAndOnly(userCitizenship), stringBag("Swedish", "German"))
возвращает значение true, если пользователь имеет единственное гражданство, равное шведскому или немецкому.
stringContains("a", "alfa")
возвращает true, если вторая строка содержит первую. Таким образом, в этом примере он возвращает true.
person
David Brossard
schedule
23.05.2018