Model Storage
Ao contrário da política, o modelo só pode ser carregado, não pode ser salvo. Acreditamos que o modelo não é um componente dinâmico e não deve ser modificado em tempo de execução, por isso não implementamos uma API para salvar o modelo no armazenamento.
No entanto, há boas notícias. Fornecemos três maneiras equivalentes de carregar um modelo, seja estaticamente ou dinamicamente:
Carregar modelo a partir de arquivo .CONF
Esta é a maneira mais comum de usar o Casbin. É fácil de entender para iniciantes e conveniente para compartilhar quando você precisa de ajuda da equipe do Casbin.
O conteúdo do arquivo .CONF
examples/rbac_model.conf é o seguinte:
[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
Então você pode carregar o arquivo de modelo da seguinte forma:
e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")
Carregar modelo a partir do código
O modelo pode ser inicializado dinamicamente a partir do código em vez de usar um arquivo .CONF
. Aqui está um exemplo para o 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)
Carregar modelo a partir de string
Alternativamente, você pode carregar todo o texto do modelo a partir de uma string de várias linhas. A vantagem dessa abordagem é que você não precisa manter um arquivo 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)