Как я могу написать условие «Если ... тогда» в Аксиоматике - PullRequest
1 голос
/ 04 августа 2020

Решение - разрешить, если у пользователя есть требуемые роли. Необходимые роли и текущие разрешения пользователя представлены в формате JSON.

Требуемые разрешения: (Сохранены как атрибут)

{
  "data": {
    "service1": {
      "service1.1": true
    },
    "service2": {
      "service2.1: false,
      "service2.2": true,
      "service2.3": false
    }
  }
}

Текущие разрешения пользователя:

{
  "data": {
    "service1": {
      "service1.1": true
    },
    "service2": {
      "service2.1: false,
      "service2.2": false,
      "service2.3": true
    }
  }
}

Чтобы принять решение, нам нужно проверить, есть ли у пользователя службы как истинные, аналогичные требуемым разрешениям. В приведенном выше примере пользователь имеет data.service1.service1.1 как true и data.service2.service2.3 как true, где требуемые роли - data.service1.service1.1 как true и data.service2.service2.2 как true. правда, в данном случае мы отрицаем.

Я написал отдельные правила для проверки для каждой услуги, но это будет только проверка комбинации услуг.

   rule service1.1{               
    permit
    condition               
      (allOf(function[booleanEqual], true, requiredRoles.data.service1.service1.1))
      &&
      (allOf(function[booleanEqual], true, requiredRoles.data.service1.service1.1))        
        on permit {
            advice reasonForPermit{
            reasonAttribute=   "Contains Valid services" 
            }
        }
    }

Кто-нибудь, пожалуйста помогите как написать если .. то проверьте в альфе?

Ответы [ 2 ]

3 голосов
/ 04 августа 2020

В 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)
}
0 голосов
/ 06 августа 2020

Мне удалось это сделать, создав отдельные атрибуты для каждой службы и написав правило с целевым предложением для службы из требуемых ролей, и условие будет, если служба в разрешенной роли истинна. Я объединил все правила, как показано ниже, в политике, используя алгоритм allowunlessDeny

rule rule1 {        
    target clause requiredRoles.service1_1 == true
    deny
    condition 
        not(permittedRoles.service1_1 == true)
       
    on permit {
        advice reasonForPermit {
            reasonAttribute= "User has valid services" 
        }
    }
}

Спасибо за предложение, Пабло.

...