Прежде всего, давайте сделаем шаг назад и обновим наши воспоминания. Есть 3 структурные элементы в XACML:
PolicySet
, которые могут содержать PolicySet
и Policy
элементы
Policy
, которые могут содержать Rule
элементы.
Rule
, которые содержат желаемый эффект (разрешение или запрет).
Rule
содержит как Target
элемент и элемент Condition
, которые определяют, когда будет применяться правило.
Rule
будет применяться только и вернуть его действие, если оба Target
и Condition
оценить истина, т.е. если все матчи в Target
являются правильными и если все части Condition
в конечном счете оценить в True.
Давайте возьмем ваш пример:
- Правило 1: вернуть разрешение, если ток время> 1 вечер и текущее время < 6 вечера и дата == 23/07/2015.
Код в ALFA будет:
policy parent{
apply firstApplicable
rule example{
permit
condition currentTime>"13:00:00":time &&
currentTime<"18:00:00":time &&
currentDate=="2015-07-23":date
}
}
Правило будет применимо только и только вернуть его действие, в данном случае разрешение, если все матчи в состоянии оценить, верно.
Что делать, если мы используем 2 правила для выражения той же логики? Что происходит тогда? Разделим условие на 2 правила:
policy parent{
apply firstApplicable
rule checkTime{
permit
condition currentTime>"13:00:00":time &&
currentTime<"18:00:00":time
}
rule checkDate{
permit
condition currentDate=="2015-07-23":date
}
}
Что происходит? Результат не тот. На самом деле, если политика имеет 2 правила для детей, как она определяет, какой из них следует учитывать? Здесь находится шаг combining algorithms. Алгоритм комбинирования определяется на уровне политики и на уровне PolicySet. См. here for a full list and details.
В приведенном выше примере, мы используем
apply firstApplicable
Это означает, что если Правило говорит разрешение, то второй один даже не будет рассматриваться для оценки. Другими словами, ограничение даты не будет проверяться. Следовательно, набор из 2 правил не эквивалентен первоначальному условию, которое мы написали.
Мы все еще можем переработать 2 правила, чтобы они работали как условие - или почти. Один из таких способов состоит в том, чтобы повернуть проверки и сделать правила отрицательными: отрицать, если время находится за пределами диапазона 1-6. Запретить, если дата «2015-07-23». Только тогда можно будет определить правило разрешения для доступа. Переработан пример становится в АЛЬФА:
policy parent{
apply firstApplicable
rule checkTime{
deny
condition currentTime<="13:00:00":time ||
currentTime>="18:00:00":time
}
rule checkDate{
deny
condition not(currentDate=="2015-07-23":date)
}
rule allowAccess{
permit
}
}
Суть, однако, это: то, что вы хотите выразить? Важно ли проводить различие между проверкой времени и проверкой даты? Имеет ли смысл иметь в виду 2 правила? Единственное правило? Это полностью зависит от вас.
Для редактирования типовых политик вы можете скачать ALFA plugin from here.
HTH
Спасибо за ваш ответ Дэвид. Очень понятно. Просто быстрый вопрос. Вторая политика с двумя правилами работает, как и ворота ИЛИ, другими словами, верно ?. (Просто, чтобы сделать это более ясным для себя). И в случае, если у нас есть 3 или 4 правила, опять же, если первое правило - True, то остальные, не будут рассматриваться, правильно? – Bobys
В некотором смысле да, он работает как неисключительный ИЛИ. Но помните, что XACML может оценить NotApplicable. Это точка окончательного пустого правила - чтобы убедиться, что мы не получаем NotApplicable. Вы можете прочитать больше об объединении алгоритмов здесь: http://developers.axiomatics.com/blog/index/entry/understanding-xacml-combining-algorithms.html –
Спасибо. Ваш ответ отмечен как принятый! – Bobys