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