XACML - разница между условием AND и двумя правилами
В чем разница между XACML, который использует функцию AND, которая содержит два условия, например. одним условием будет время в диапазоне 1-6 и дата, равная 23/07/2015
А другой XACML будет иметь два правила, одно из которых будет временем в диапазоне 1-6, а другое - датой, равной 23/07/2015.
Я имею в виду, как они работают? Первое, функция AND должна быть истинной, чтобы получить эффект разрешения. Как насчет второго? Просто проверит, верно ли одно из этих двух правил и даст ли разрешение разрешение, или оба правила должны быть верными, как первое?
1 ответ
Прежде всего, давайте сделаем шаг назад и освежим наши воспоминания. В XACML есть 3 структурных элемента:
PolicySet
который может содержатьPolicySet
а такжеPolicy
элементыPolicy
который может содержатьRule
элементы.Rule
которые содержат желаемый эффект (либо Permit, либо Deny).
Rule
содержит как Target
элемент и Condition
элемент, который определяет, когда правило будет применяться.
Rule
будет применяться и вернуть свой эффект, если оба Target
и Condition
оценивать как истинное, т.е. если все совпадения в Target
являются правильными, и если все части Condition
в итоге оцените в True.
Давайте возьмем ваш пример:
- Правило 1: возврат разрешения, если текущее время>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 дочерних правила, как она определяет, какое из них следует рассмотреть? Здесь вступают в силу алгоритмы объединения. Алгоритм объединения определяется на уровне политик и уровне политик. Смотрите здесь для полного списка и деталей.
В приведенном выше примере мы используем
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 отсюда.
НТН