Passer au contenu principal

Model Storage

Contrairement à la politique, le modèle ne peut être chargé, il ne peut pas être sauvegardé. Nous pensons que le modèle n'est pas un composant dynamique et ne devrait pas être modifié en temps réel, nous n'avons donc pas mis en œuvre une API pour sauvegarder le modèle dans le stockage.

Cependant, il y a de bonnes nouvelles. Nous proposons trois façons équivalentes de charger un modèle, soit de manière statique, soit de manière dynamique :

Charger le modèle à partir du fichier .CONF

C'est la façon la plus courante d'utiliser Casbin. Il est facile à comprendre pour les débutants et pratique à partager lorsque vous avez besoin de l'aide de l'équipe Casbin.

Le contenu du fichier .CONF examples/rbac_model.conf est le suivant :

[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

Ensuite, vous pouvez charger le fichier de modèle comme suit :

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

Charger le modèle à partir du code

Le modèle peut être initialisé dynamiquement à partir du code au lieu d'utiliser un fichier .CONF. Voici un exemple pour le modèle 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)

Charger le modèle à partir d'une chaîne de caractères

Alternativement, vous pouvez charger l'intégralité du texte du modèle à partir d'une chaîne de caractères multilignes. L'avantage de cette approche est que vous n'avez pas besoin de maintenir un fichier de modèle.

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)