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

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.

Token name convention

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