RBAC
Definición de Rol
La [role_definition]
se utiliza para definir las relaciones de herencia de roles en RBAC. Casbin soporta múltiples instancias de sistemas RBAC, donde los usuarios pueden tener roles y sus relaciones de herencia, y los recursos también pueden tener roles y sus relaciones de herencia. Estos dos sistemas RBAC no interferirán entre sí.
Esta sección es opcional. Si no utilizas roles RBAC en el modelo, entonces omite esta sección.
[role_definition]
g = _, _
g2 = _, _
La definición de rol anterior muestra que g
es un sistema RBAC, y g2
es otro sistema RBAC. _,_
significa que hay dos partes involucradas en una relación de herencia. En el caso más común, usualmente usas g
solo si solo necesitas roles para usuarios. También puedes usar tanto g
como g2
cuando necesitas roles (o grupos) tanto para usuarios como para recursos. Por favor, consulta los ejemplos en rbac_model.conf y rbac_model_with_resource_roles.conf.
Casbin almacena el mapeo real de usuario-rol (o mapeo de recurso-rol si estás utilizando roles en recursos) en la política. Por ejemplo:
p, data2_admin, data2, read
g, alice, data2_admin
Significa que alice
hereda/es miembro del rol data2_admin
. Aquí, alice
puede ser un usuario, un recurso o un rol. Casbin solo lo reconoce como una cadena de caracteres.
Entonces, en un comparador, debes verificar el rol como se muestra a continuación:
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Significa que el sub
en la solicitud debe tener el rol sub
en la política.
- Casbin solo almacena el mapeo de usuario-rol.
- Casbin no verifica si un usuario es un usuario válido o un rol es un rol válido. Eso debe ser manejado por la autenticación.
- No uses el mismo nombre para un usuario y un rol dentro de un sistema RBAC, porque Casbin reconoce a los usuarios y roles como cadenas de caracteres, y no hay manera de que Casbin sepa si estás especificando al usuario
alice
o al rolalice
. Puedes resolverlo simplemente utilizandorole_alice
. - Si
A
tiene el rolB
, yB
tiene el rolC
, entoncesA
tiene el rolC
. Esta transitividad es infinita por ahora.
Convencionalmente, el nombre del token de sujeto en la definición de la política es sub
y se coloca al principio. Ahora, Golang Casbin soporta nombres de tokens personalizados y sus posiciones. Si el nombre del token de sujeto es sub
, el token de sujeto puede colocarse en cualquier lugar sin ninguna acción adicional necesaria. Si el nombre del token de sujeto no es sub
, se debe llamar a e.SetFieldIndex()
para constant.SubjectIndex
después de que el ejecutor se inicialice, independientemente de su posición.
# `subject` here is for sub
[policy_definition]
p = obj, act, subject
e.SetFieldIndex("p", constant.SubjectIndex, 2) // index starts from 0
ok, err := e.DeleteUser("alice") // without SetFieldIndex, it will raise an error
Jerarquía de Roles
El RBAC de Casbin soporta la característica de jerarquía de roles de RBAC1, lo que significa que si alice
tiene role1
, y role1
tiene role2
, entonces alice
también tendrá role2
y heredará sus permisos.
Aquí, tenemos un concepto llamado nivel de jerarquía. Entonces, en este ejemplo, el nivel de jerarquía es 2. Para el administrador de roles incorporado en Casbin, puedes especificar el nivel máximo de jerarquía. El valor predeterminado es 10. Esto significa que un usuario final como alice
solo puede heredar 10 niveles de roles.
// NewRoleManager is the constructor for creating an instance of the
// default RoleManager implementation.
func NewRoleManager(maxHierarchyLevel int) rbac.RoleManager {
rm := RoleManager{}
rm.allRoles = &sync.Map{}
rm.maxHierarchyLevel = maxHierarchyLevel
rm.hasPattern = false
return &rm
}
¿Cómo Distinguir un Rol de un Usuario?
Casbin no distingue entre roles y usuarios en su RBAC. Ambos se tratan como cadenas de caracteres. Si solo usas un RBAC de un solo nivel (donde un rol nunca será miembro de otro rol), puedes usar e.GetAllSubjects()
para obtener todos los usuarios y e.GetAllRoles()
para obtener todos los roles. Listarán todos los u
y todos los r
, respectivamente, en todas las reglas g, u, r
.
Pero si estás utilizando un RBAC multinivel (con jerarquía de roles) y tu aplicación no registra si un nombre (cadena de caracteres) es un usuario o un rol, o tienes un usuario y un rol con el mismo nombre, puedes agregar un prefijo al rol como role::admin
antes de pasarlo a Casbin. De esta manera, sabrás si es un rol al verificar este prefijo.
¿Cómo Consultar Roles o Permisos Implícitos?
Cuando un usuario hereda un rol o permiso a través de la jerarquía de RBAC en lugar de ser asignado directamente en una regla de política, llamamos a este tipo de asignación "implícita". Para consultar tales relaciones implícitas, necesitas usar estas dos API: GetImplicitRolesForUser()
y GetImplicitPermissionsForUser()
en lugar de GetRolesForUser()
y GetPermissionsForUser()
. Para más detalles, por favor consulta este problema de GitHub.
Usando Coincidencia de Patrones en RBAC
Consulta RBAC with Pattern
Administrador de Roles
Consulta la sección de Role Managers para más detalles.