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
}