Zum Hauptinhalt springen

Model Storage

Im Gegensatz zur Richtlinie kann das Modell nur geladen werden, es kann nicht gespeichert werden. Wir sind der Meinung, dass das Modell kein dynamischer Bestandteil ist und nicht zur Laufzeit geändert werden sollte, daher haben wir keine API implementiert, um das Modell im Speicher zu speichern.

Es gibt jedoch gute Nachrichten. Wir bieten drei gleichwertige Möglichkeiten, ein Modell statisch oder dynamisch zu laden:

Modell aus .CONF-Datei laden

Dies ist die gebräuchlichste Methode, um Casbin zu verwenden. Es ist leicht zu verstehen für Anfänger und praktisch zum Teilen, wenn Sie Hilfe vom Casbin-Team benötigen.

Der Inhalt der .CONF-Datei examples/rbac_model.conf ist wie folgt:

[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

Dann können Sie die Modell-Datei wie folgt laden:

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

Modell aus Code laden

Das Modell kann dynamisch aus dem Code anstelle einer .CONF-Datei initialisiert werden. Hier ist ein Beispiel für das RBAC-Modell:

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)

Modell aus String laden

Alternativ können Sie den gesamten Modelltext aus einem mehrzeiligen String laden. Der Vorteil dieser Methode ist, dass Sie keine Modell-Datei pflegen müssen.

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)