Отношения 1: n и сложные типы атрибутов в ALFA - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь ввести нашу модель базы данных в 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
          }
      }
   }
}

1 Ответ

0 голосов
/ 23 мая 2018

У вас есть отличный вопрос.

По умолчанию все атрибуты в 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.
...