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
у політиці.
- Casbin зберігає лише відображення користувач-роль.
- Casbin не перевіряє, чи є користувач дійсним користувачем, або чи є роль дійсною роллю. Це повинно бути забезпечено аутентифікацією.
- Не використовуйте однакове ім'я для користувача та ролі всередині системи RBAC, оскільки Casbin розпізнає користувачів та ролі як рядки, і немає способу для Casbin дізнатися, чи ви вказуєте користувача
alice
або рольalice
. Ви можете просто вирішити це, використовуючиrole_alice
. - Якщо
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 з шаблоном
Менеджер ролей
Дивіться розділ Менеджери ролей для деталей.