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

ABAC

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

ABAC означає Attribute-Based Access Control. Це дозволяє контролювати доступ, використовуючи атрибути (властивості) суб'єкта, об'єкта або дії, замість самих рядкових значень. Ви могли чути про складну мову контролю доступу 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.

порада

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

порада

Якщо вам потрібно використовувати кому в політиці, яка конфліктує з роздільником 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