RBAC with Domains
Definición de Rol con Inquilinos de Dominio
Los roles RBAC en Casbin pueden ser globales o específicos de un dominio. Roles específicos de dominio significan que los roles para un usuario pueden ser diferentes cuando el usuario está en diferentes dominios/inquilinos. Esto es muy útil para sistemas grandes como una nube, ya que los usuarios suelen estar en diferentes inquilinos.
La definición de rol con dominios/inquilinos debería verse así:
[role_definition]
g = _, _, _
El tercer _
representa el nombre del dominio/inquilino, y esta parte no debe ser cambiada. Entonces la política puede ser:
p, admin, tenant1, data1, read
p, admin, tenant2, data2, read
g, alice, admin, tenant1
g, alice, user, tenant2
Esto significa que el rol de admin
en tenant1
puede leer data1
. Y alice
tiene el rol de admin
en tenant1
y el rol de user
en tenant2
. Por lo tanto, ella puede leer data1
. Sin embargo, dado que alice
no es admin
en tenant2
, no puede leer data2
.
Entonces, en un comparador, deberías verificar el rol de la siguiente manera:
[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
Por favor, consulte el rbac_with_domains_model.conf para ejemplos.
Nota: Convencionalmente, el nombre del token de dominio en la definición de política es dom
y se coloca como el segundo token (sub, dom, obj, act
).
Ahora, Golang Casbin soporta nombres de tokens personalizados y su colocación. Si el nombre del token de dominio es dom
, el token de dominio puede colocarse en una posición arbitraria sin ninguna acción adicional. Si el nombre del token de dominio no es dom
, se debe llamar a e.SetFieldIndex()
para constant.DomainIndex
después de que el ejecutor esté inicializado, independientemente de su posición.
# `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