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

RBAC

Визначення ролі

[role_definition] використовується для визначення відносин спадкування ролей RBAC. Casbin підтримує кілька інстанцій систем RBAC, де користувачі можуть мати ролі та їх відносини спадкування, а ресурси також можуть мати ролі та їх відносини спадкування. Ці дві системи RBAC не будуть втручатися одна в одну.

Цей розділ є необов'язковим. Якщо ви не використовуєте ролі RBAC у моделі, то пропустіть цей розділ.

[role_definition]
g = _, _
g2 = _, _

Вищевказане визначення ролі показує, що g є системою RBAC, а g2 є іншою системою RBAC. _,_ означає, що у відносині спадкування беруть участь дві сторони. У найбільш поширеному випадку, зазвичай ви використовуєте g самостійно, якщо вам потрібні лише ролі для користувачів. Ви також можете використовувати як g, так і g2, коли вам потрібні ролі (або групи) для користувачів та ресурсів. Будь ласка, перегляньте rbac_model.conf та rbac_model_with_resource_roles.conf для прикладів.

Casbin зберігає фактичне відображення користувач-роль (або відображення ресурс-роль, якщо ви використовуєте ролі на ресурсах) у політиці. Наприклад:

p, data2_admin, data2, read
g, alice, data2_admin

Це означає, що alice успадковує/є членом ролі data2_admin. Тут alice може бути користувачем, ресурсом або роллю. Casbin розпізнає це лише як рядок.

Тоді, у матчері, ви повинні перевірити роль, як показано нижче:

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

Це означає, що sub у запиті повинен мати роль sub у політиці.

примітка
  1. Casbin зберігає лише відображення користувач-роль.
  2. Casbin не перевіряє, чи є користувач дійсним користувачем, або чи є роль дійсною роллю. Це повинно бути забезпечено аутентифікацією.
  3. Не використовуйте однакове ім'я для користувача та ролі всередині системи RBAC, оскільки Casbin розпізнає користувачів та ролі як рядки, і немає способу для Casbin дізнатися, чи ви вказуєте користувача alice або роль alice. Ви можете просто вирішити це, використовуючи role_alice.
  4. Якщо A має роль B, і B має роль C, то A має роль C. Ця транзитивність є нескінченною наразі.
Конвенція іменування токенів

Зазвичай, ім'я токена суб'єкта у визначенні політики є sub і розміщується на початку. Тепер Golang Casbin підтримує налаштовані імена токенів та їх розміщення. Якщо ім'я токена суб'єкта є sub, токен суб'єкта може бути розміщений у будь-якому місці без будь-яких додаткових дій. Якщо ім'я токена суб'єкта не є sub, e.SetFieldIndex() для constant.SubjectIndex повинен бути викликаний після ініціалізації примусовика, незалежно від його позиції.

# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error

Ієрархія ролей

RBAC у Casbin підтримує функцію ієрархії ролей RBAC1, що означає, що якщо alice має role1, і role1 має role2, то alice також матиме role2 та успадкує його дозволи.

Тут у нас є поняття, яке називається рівень ієрархії. Отже, у цьому прикладі рівень ієрархії становить 2. Для вбудованого менеджера ролей у Casbin, ви можете вказати максимальний рівень ієрархії. Значення за замовчуванням становить 10. Це означає, що кінцевий користувач, як alice, може успадкувати лише 10 рівнів ролей.

// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false

return &rm
}

Як розрізнити роль від користувача?

Casbin не робить розрізнення між ролями та користувачами у своєму RBAC. Вони обидва розглядаються як рядки. Якщо ви використовуєте лише однорівневий RBAC (де роль ніколи не буде членом іншої ролі), ви можете використовувати e.GetAllSubjects() для отримання всіх користувачів та e.GetAllRoles() для отримання всіх ролей. Вони перерахують всі u та всі r відповідно у всіх правилах g, u, r.

Але якщо ви використовуєте багаторівневий RBAC (з ієрархією ролей) і ваша програма не записує, чи є ім'я (рядок) користувачем або роллю, або у вас є користувач та роль з однаковим ім'ям, ви можете додати префікс до ролі, як role::admin перед тим, як передати її до Casbin. Таким чином, ви будете знати, що це роль, перевіряючи цей префікс.

Як запитати неявні ролі або дозволи?

Коли користувач успадковує роль або дозвіл через ієрархію RBAC, а не отримує їх безпосередньо у правилі політики, ми називаємо цей тип призначення "неявним". Для запиту таких неявних відносин, вам потрібно використовувати ці два API: GetImplicitRolesForUser() та GetImplicitPermissionsForUser() замість GetRolesForUser() та GetPermissionsForUser(). Для більш детальної інформації, будь ласка, перегляньте це GitHub issue.

Використання шаблонного зіставлення у RBAC

Дивіться RBAC з шаблоном

Менеджер ролей

Дивіться розділ Менеджери ролей для деталей.