RBAC с доменами
Определение роли с владельцами доменов
Роли RBAC в Касбине могут быть глобальными или специфичными для домена. Домен-указывать роли означают, что роли для пользователя могут отличаться в том случае, когда пользователь находится в разных доменах/арендаторах. Это очень полезно для больших систем, таких как облако, так как пользователи обычно находятся в разных арендаторах.
Определение роли с доменами/арендаторами должно быть следующим:
[role_definition]
g = _, _, _
Третий _
означает, что имя домена/арендатора эта часть не должна быть изменена. Тогда политика может быть:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Это означает, роли администратора
в арендатор1
могут читать данных1
. И alice
имеет роль администратора
в арендатор1
, и имеет роль
в арендатор2
. Поэтому она может прочитать данные1
. Однако, поскольку alice
не является администратором
в tenant2
, она не может прочитать данные2
.
Затем в матче, вы должны проверить роль, как показано ниже:
[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.
Note: Conventionally domain token name in policy definition is dom
and placed as the second token(sub, dom, obj, act
). Now Golang Casbin supports customized token name & place. If the domain token name is dom
, the domain token can be placed at an arbitrary place and no extra action needs. If the domain token name is not dom
, e.SetFieldIndex()
for constant.DomainIndex
should be called after the enforcer is initialized regardless of its position.
# `domain` here for `dom`
[policy_definition]
p = sub, obj, act, domain
e.SetFieldIndex("p", constant.DomainIndex, 3) // index start from 0
users := e.GetAllUsersByDomain("domain1") // without SetFieldIndex, it will raise an error