Vai al contenuto principale

Model Storage

A differenza della policy, il modello può essere solo caricato, non può essere salvato. Crediamo che il modello non sia un componente dinamico e non dovrebbe essere modificato durante il runtime, quindi non abbiamo implementato un'API per salvare il modello nella memoria di archiviazione.

Tuttavia, c'è una buona notizia. Forniamo tre modi equivalenti per caricare un modello, sia staticamente che dinamicamente:

Carica il modello dal file .CONF

Questo è il modo più comune per utilizzare Casbin. È facile da capire per i principianti e conveniente per condividere quando hai bisogno di aiuto dal team di Casbin.

Il contenuto del file .CONF examples/rbac_model.conf è il seguente:

[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

Quindi puoi caricare il file del modello come segue:

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

Carica il modello dal codice

Il modello può essere inizializzato dinamicamente dal codice invece di utilizzare un file .CONF. Ecco un esempio per il modello 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)

Carica il modello da stringa

In alternativa, puoi caricare l'intero testo del modello da una stringa su più righe. Il vantaggio di questo approccio è che non è necessario mantenere un file modello.

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)