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

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