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

RBAC with Domains

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

Ролі RBAC у Casbin можуть бути глобальними або специфічними для домену. Специфічні для домену ролі означають, що ролі користувача можуть відрізнятися, коли користувач перебуває в різних доменах/орендарях. Це дуже корисно для великих систем, як-от хмара, оскільки користувачі зазвичай перебувають в різних орендарях.

Визначення ролі з доменами/орендарями має виглядати так:

[role_definition]
g = _, _, _

Третій _ представляє назву домену/орендаря, і ця частина не повинна змінюватися. Тоді політика може бути такою:

p, admin, tenant1, data1, read
p, admin, tenant2, data2, read

g, alice, admin, tenant1
g, alice, user, tenant2

Це означає, що роль admin у tenant1 може читати data1. І alice має роль admin у tenant1 та роль user у tenant2. Отже, вона може читати data1. Однак, оскільки alice не є admin у tenant2, вона не може читати data2.

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

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

Будь ласка, зверніться до rbac_with_domains_model.conf для прикладів.

Конвенція назви токена

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

# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error