Перейти к основному контенту

ABAC

Что такое модель ABAC?

ABAC означает контроль доступа на основе атрибутов. Он позволяет вам контролировать доступ, используя атрибуты (свойства) субъекта, объекта или действия, вместо использования самих строковых значений. Возможно, вы слышали о сложном языке контроля доступа ABAC под названием XACML. ABAC в Casbin, с другой стороны, намного проще. В ABAC Casbin вы можете использовать структуры или экземпляры классов вместо строк для элементов модели.

Давайте посмотрим на официальный пример ABAC:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = r.sub == r.obj.Owner

В сопоставителе мы используем r.obj.Owner вместо r.obj. r.obj, переданный в функцию Enforce(), будет структурой или экземпляром класса, а не строкой. Casbin будет использовать отражение для извлечения переменной члена obj в этой структуре или классе для вас.

Вот определение для структуры или класса r.obj:

type testResource struct {
Name string
Owner string
}

Если вы хотите передать параметры в принудительное исполнение через JSON, вам нужно включить функцию с e.EnableAcceptJsonRequest(true).

Например:

e, _ := NewEnforcer("examples/abac_model.conf")
e.EnableAcceptJsonRequest(true)

data1Json := `{ "Name": "data1", "Owner": "bob"}`

ok, _ := e.Enforce("alice", data1Json, "read")
заметка

Включение функции принятия параметров JSON может привести к снижению производительности от 1,1 до 1,5 раз.

Как использовать ABAC?

Чтобы использовать ABAC, вам нужно сделать две вещи:

  1. Укажите атрибуты в сопоставителе модели.
  2. Передайте структуру или экземпляр класса для элемента в качестве аргумента в функцию Enforce() Casbin.
опасность

В настоящее время только элементы запроса, такие как r.sub, r.obj, r.act и так далее, поддерживают ABAC. Вы не можете использовать его на элементах политики, таких как p.sub, потому что нет способа определить структуру или класс в политике Casbin.

tip

Вы можете использовать несколько атрибутов ABAC в сопоставителе. Например: m = r.sub.Domain == r.obj.Domain.

tip

Если вам нужно использовать запятую в политике, которая конфликтует с разделителем CSV, вы можете экранировать ее, заключив утверждение в кавычки. Например, "keyMatch("bob", r.sub.Role)" не будет разделено.

Масштабирование модели для сложных и больших чисел правил ABAC

Вышеуказанная реализация модели ABAC в своей основе проста. Однако во многих случаях система авторизации требует сложного и большого числа правил ABAC. Чтобы удовлетворить это требование, рекомендуется добавлять правила в политику, а не в модель. Это можно сделать, введя функциональную конструкцию eval(). Вот пример:

Это определение файла CONF, используемого для определения модели ABAC.

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub_rule, obj, act

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = eval(p.sub_rule) && r.obj == p.obj && r.act == p.act

В этом примере p.sub_rule - это структура или класс (пользовательский тип), который содержит необходимые атрибуты для использования в политике.

Это политика, которая используется против модели для Enforcement. Теперь вы можете использовать переданный в eval() экземпляр объекта в качестве параметра для определения определенных ограничений ABAC.

p, r.sub.Age > 18, /data1, read
p, r.sub.Age < 60, /data2, write