Ir al contenido principal

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.

nota

Si usas el editor en línea, este especifica la función de coincidencia de patrones en la esquina inferior izquierda. editor-tips

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:

e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

Cuando usas una función de coincidencia de patrones en dominios/tenants, necesitas registrar la función con el enforcer y el modelo.

e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

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.