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

How It Works

У Casbin модель контролю доступу абстрагується у файл CONF на основі метамоделі PERM (Policy, Effect, Request, Matchers). Перемикання або оновлення механізму авторизації для проекту так само просто, як зміна конфігурації. Ви можете налаштувати власну модель контролю доступу, комбінуючи доступні моделі. Наприклад, ви можете поєднати ролі RBAC та атрибути ABAC разом у одній моделі та використовувати один набір правил політики.

Модель PERM складається з чотирьох основ: Policy, Effect, Request та Matchers. Ці основи описують відносини між ресурсами та користувачами.

Request

Визначає параметри запиту. Базовий запит - це об'єкт кортежу, який вимагає принаймні суб'єкта (сутність, що отримує доступ), об'єкта (ресурс, до якого отримується доступ) та дії (метод доступу).

Наприклад, визначення запиту може виглядати так: r={sub,obj,act}

Це визначення вказує імена параметрів та порядок, необхідний для функції відповідності контролю доступу.

Policy

Визначає модель для стратегії доступу. Вона вказує ім'я та порядок полів у документі правила Policy.

Наприклад: p={sub, obj, act} або p={sub, obj, act, eft}

Примітка: Якщо eft (результат політики) не визначено, поле результату у файлі політики не буде прочитано, і результат відповідної політики буде дозволено за замовчуванням.

Matcher

Визначає правила відповідності для запиту та політики.

Наприклад: m = r.sub == p.sub && r.act == p.act && r.obj == p.obj Це просте та поширене правило відповідності означає, що якщо запитувані параметри (сутності, ресурси та методи) дорівнюють тим, що знайдені у політиці, тоді повертається результат політики (p.eft). Результат стратегії буде збережено в p.eft.

Effect

Виконує логічне поєднання суджень про результати відповідності Matchers.

Наприклад: e = some(where(p.eft == allow))

Це твердження означає, що якщо результат відповідної стратегії p.eft має результат (деякі) дозволити, тоді кінцевий результат є істинним.

Давайте розглянемо інший приклад:

e = some(where (p.eft == allow)) && !some(where (p.eft == deny))

Логічне значення цього прикладу комбінації: якщо є стратегія, яка відповідає результату дозволити і немає стратегії, яка відповідає результату заборонити, результат є істинним. Іншими словами, це істинно, коли відповідні стратегії всі дозволяють. Якщо є будь-яке заборонення, обидва є неправдивими (простіше кажучи, коли дозвіл та заборона існують одночасно, заборона має пріоритет).

Найбазовіша та найпростіша модель у Casbin - це ACL. Модель CONF для ACL виглядає так:

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

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

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

Приклад політики для моделі ACL:

p, alice, data1, read
p, bob, data2, write

Це означає:

  • alice може читати data1
  • bob може писати data2

Ми також підтримуємо багаторядковий режим, додаючи '' в кінці:

# Matchers
[matchers]
m = r.sub == p.sub && r.obj == p.obj \
&& r.act == p.act

Крім того, якщо ви використовуєте ABAC, ви можете спробувати оператор 'in', як показано в наступному прикладі для видання Casbin golang (jCasbin та Node-Casbin ще не підтримуються):

# Matchers
[matchers]
m = r.obj == p.obj && r.act == p.act || r.obj in ('data2', 'data3')

Але ви МУСИТЕ переконатися, що довжина масиву є БІЛЬШОЮ, ніж 1, інакше це спричинить паніку.

Для більшої кількості операторів ви можете подивитися на govaluate.