Ir al contenido principal

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.

nota
  1. Casbin solo almacena el mapeo de usuario-rol.
  2. 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.
  3. 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 rol alice. Puedes resolverlo simplemente utilizando role_alice.
  4. Si A tiene el rol B, y B tiene el rol C, entonces A tiene el rol C. Esta transitividad es infinita por ahora.
Convención de Nombres de Tokens

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.