Ir al contenido principal

Model Storage

A diferencia de la política, el modelo solo puede ser cargado, no puede ser guardado. Creemos que el modelo no es un componente dinámico y no debería ser modificado en tiempo de ejecución, por lo tanto, no hemos implementado una API para guardar el modelo en el almacenamiento.

Sin embargo, hay buenas noticias. Ofrecemos tres maneras equivalentes de cargar un modelo, ya sea de manera estática o dinámica:

Cargar modelo desde archivo .CONF

Esta es la manera más común de usar Casbin. Es fácil de entender para principiantes y conveniente para compartir cuando necesitas ayuda del equipo de Casbin.

El contenido del archivo .CONF examples/rbac_model.conf es como sigue:

[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

Entonces puedes cargar el archivo de modelo de la siguiente manera:

e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

Cargar modelo desde código

El modelo puede ser inicializado dinámicamente desde el código en lugar de usar un archivo .CONF. Aquí hay un ejemplo para el modelo RBAC:

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/casbin/v2/persist/file-adapter"
)

// Initialize the model from Go code.
m := model.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)

Cargar modelo desde una cadena de texto

Alternativamente, puedes cargar todo el texto del modelo desde una cadena de texto multilínea. La ventaja de este enfoque es que no necesitas mantener un archivo de modelo.

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
)

// Initialize the model from a string.
text :=
`
[request_definition]
r = sub, obj, act

[policy_definition]
p = sub, obj, act

[role_definition]
g = _, _

[policy_effect]
e = some(where (p.eft == allow))

[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
`
m, _ := model.NewModelFromString(text)

// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid using files.
a := fileadapter.NewAdapter("examples/rbac_policy.csv")

// Create the enforcer.
e := casbin.NewEnforcer(m, a)