RBAC with Pattern
Inicio Rápido
Usa patrón en
g(_, _)
.e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)Usa patrón con dominio.
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
Usa todos los patrones.
Solo combina el uso de ambas APIs.
Como se muestra arriba, después de crear la instancia de enforcer
, necesitas activar la coincidencia de patrones a través de las APIs AddNamedMatchingFunc
y AddNamedDomainMatchingFunc
, que determinan cómo se realiza la coincidencia de patrones.
Si usas el editor en línea, este especifica la función de coincidencia de patrones en la esquina inferior izquierda.
Usa coincidencia de patrones en RBAC
A veces, quieres que ciertos sujetos, objetos o dominios/tenants con un patrón específico sean automáticamente asignados a un rol. Las funciones de coincidencia de patrones en RBAC pueden ayudarte a hacer eso. Una función de coincidencia de patrones comparte los mismos parámetros y valor de retorno que la función de coincidencia anterior.
La función de coincidencia de patrones soporta cada parámetro de g
.
Sabemos que normalmente RBAC se expresa como g(r.sub, p.sub)
en un coincidente. Entonces podemos usar una política como:
p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group
Así alice
puede leer todos los libros incluyendo book 1
y book 2
. Pero puede haber miles de libros, y es muy tedioso agregar cada libro al rol de libro (o grupo) con una regla de política g
.
Pero con funciones de coincidencia de patrones, puedes escribir la política con solo una línea:
g, /book/:id, book_group
Casbin coincidirá automáticamente /book/1
y /book/2
en el patrón /book/:id
por ti. Solo necesitas registrar la función con el enforcer como:
- Go
- Node.js
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
Cuando usas una función de coincidencia de patrones en dominios/tenants, necesitas registrar la función con el enforcer y el modelo.
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
Si no entiendes qué significa g(r.sub, p.sub, r.dom)
, por favor lee rbac-with-domains. En resumen, g(r.sub, p.sub, r.dom)
verificará si el usuario r.sub
tiene un rol p.sub
en el dominio r.dom
. Así es como funciona el coincidente. Puedes ver el ejemplo completo aquí.
Aparte de la sintaxis de coincidencia de patrones anterior, también podemos usar un patrón de dominio puro.
Por ejemplo, si queremos que sub
tenga acceso en diferentes dominios, domain1
y domain2
, podemos usar el patrón de dominio puro:
p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write
g, alice, admin, *
g, bob, admin, domain2
En este ejemplo, queremos que alice
lea y escriba data
en domain1 y domain2. La coincidencia de patrones *
en g
hace que alice
tenga acceso a dos dominios.
Al usar coincidencia de patrones, especialmente en escenarios que son más complicados y tienen muchos dominios u objetos a considerar, podemos implementar la policy_definition
de una manera más elegante y efectiva.