В ALFA (или XACML) нет конструкции if..then
. Вместо этого вы используете комбинирующие алгоритмы. В частности, onPermitApplySecond - это алгоритм объединения политик, который больше всего напоминает конструкцию if..then
.
Однако обычно существует более простой способ express того, что вы хотите, если вы можете сделать разумные предположения о ваших атрибутивных данных. В вашем примере, например, если всегда гарантируется, что и требуемые, и текущие разрешения содержат ровно одно логическое значение для каждой доступной службы, тогда вы можете написать:
rule {
target
clause requiredRoles_service1_1 == false or permitted_service1_1 == true
clause requiredRoles_service2_1 == false or permitted_service2_1 == true
...
permit
}
Помните, что в цели есть предложения И объединились. Затем это правило проверяет, что для каждой службы роль либо не требуется, либо задана в текущих разрешениях.
Если вместо этого это может произойти, то какой-либо из этих атрибутов отсутствует (т. Е. Нет значений для атрибут), то вы должны остерегаться этого случая. Вы можете сделать это, используя условие, подобное следующему, но есть и другие способы:
rule {
permit
condition
(not(booleanIsIn(true, requiredRoles_service1_1)) || booleanIsIn(true, permitted_service1_1))
&&
(not(booleanIsIn(true, requiredRoles_service2_1)) || booleanIsIn(true, permitted_service2_1))
&&
...
}
В общем, обычно есть более простые способы express политики, если вы можете массировать данные атрибутов в другие формы. Наличие пары атрибутов для каждой службы, как в приведенных выше примерах, может не потребоваться.
Если бы вы могли собрать все требуемые роли и текущие разрешения в каждом из атрибутов, то политику можно было бы выразить гораздо более компактно. Допустим, у вас есть два атрибута, requiredRoles
и permittedRoles
, значения которых перечисляют роли служб, необходимые и разрешенные для данного пользователя, соответственно. В вашем примере это будет означать, что requiredRoles
имеет значение, скажем, ["service1.1", "service2.2"] и permittedRoles
имеет значение ["service1.1" , "service2.3"] . Тогда вы можете написать такое правило:
rule {
permit
condition stringSubSet(requiredRoles, permittedRoles)
}