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. Алиса является admin в tenant1 и user в tenant2; она может читать data1, но не data2 (только admin в tenant2 может читать data2).
Matcher: включите домен в g и потребуйте его совпадения:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Пользовательское имя токена домена
По соглашению домен называется dom, но вы можете использовать любое имя (tenant, workspace и т.д.) в определениях запроса и политики:
[request_definition]
r = sub, tenant, obj, act
[policy_definition]
p = sub, tenant, obj, act
[role_definition]
g = _, _, _
[matchers]
m = g(r.sub, p.sub, r.tenant) && r.tenant == p.tenant && r.obj == p.obj && r.act == p.act
При использовании сопоставления по шаблону (например, keyMatch) для доменов, Casbin определяет токен домена из модели, если домен находится под индексом 1 как в запросе, так и в политике:
[matchers]
m = g(r.sub, p.sub, r.tenant) && keyMatch(r.tenant, p.tenant) && r.obj == p.obj && r.act == p.act
Для API доменов (например, GetAllUsersByDomain()) с пользовательским именем или позицией токена домена установите индекс после создания энфорсера. Полный пример: rbac_with_domains_model.conf.
Домен обычно называется dom и размещается вторым (sub, dom, obj, act). В Go-версии Casbin можно использовать другое имя или позицию; тогда вызовите e.SetFieldIndex("p", constant.DomainIndex, index) после инициализации, чтобы такие API, как GetAllUsersByDomain(), работали корректно.
# Using `domain` instead of `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index starts from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, this will raise an error
Вложенные подразделения
Если домены образуют дерево (компания содержит отделы и департаменты) и роль, предоставленная на уровне подразделения, должна применяться ко всему его поддереву, см. Nested Organizations.
Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.