Прежде всего, давайте сделаем шаг назад и освежим наши воспоминания. В XACML есть 3 структурных элемента:
PolicySet
, который может содержать элементы PolicySet
и Policy
Policy
, который может содержать Rule
элементов.
Rule
, которые содержат желаемый эффект (разрешение или запрет).
Rule
содержит как элемент Target
, так и элемент Condition
, которые определяют, когда будет применяться Правило.
Rule
будет применяться и возвращать свой эффект только в том случае, если и Target
, и Condition
оцениваются как истина, т.е. если все совпадения в Target
верны и если все части Condition
в конечном итоге оцениваются как истинные.
Возьмем ваш пример:
- Правило 1: верните Permit, если текущее время> 13:00, а текущее время ‹18:00 и дата == 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 дочерних правила, как она определяет, какое из них следует учитывать? Здесь вступает в действие комбинирование алгоритмов. A алгоритм комбинирования определяется на уровне политики и уровне набора политик. См. здесь для получения полного списка и подробностей.
В приведенном выше примере мы используем
apply firstApplicable
Это означает, что если в Правиле указано «Разрешить», то второе даже не будет рассматриваться для оценки. Другими словами, ограничение даты не будет проверяться. Следовательно, набор из 2 правил не эквивалентен написанному нами исходному условию.
Мы все еще можем переработать 2 правила, чтобы они работали как условие - или почти. Один из таких способов - перевернуть чеки и сделать правила отрицательными: запретить, если время выходит за пределы диапазона 1-6. Отклонить, если дата - «2015-07-23». Только после этого можно было бы определить разрешающее правило для разрешения доступа. Доработанный пример становится в ALFA:
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 отсюда.
HTH
person
David Brossard
schedule
29.12.2014