Ana içeriğe atla

Model Storage

Politikadan farklı olarak, model sadece yüklenebilir, kaydedilemez. Modelin dinamik bir bileşen olmadığına ve çalışma zamanında değiştirilmemesi gerektiğine inanıyoruz, bu yüzden modeli depolamaya kaydetmek için bir API uygulamadık.

Ancak iyi haberler var. Bir modeli statik veya dinamik olarak yüklemek için üç eşdeğer yol sunuyoruz:

Modeli .CONF dosyasından yükle

Bu, Casbin'i kullanmanın en yaygın yoludur. Başlangıç ​​seviyesi kullanıcılar için anlaşılması kolaydır ve Casbin ekibinden yardım almanız gerektiğinde paylaşım açısından uygundur.

.CONF dosyasının içeriği examples/rbac_model.conf şu şekildedir:

[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

Ardından model dosyasını şu şekilde yükleyebilirsiniz:

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

Koddan model yükle

Model, bir .CONF dosyası kullanmak yerine koddan dinamik olarak başlatılabilir. İşte RBAC modeli için bir örnek:

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)

Dizeden model yükle

Alternatif olarak, tüm model metnini çok satırlı bir dizeden yükleyebilirsiniz. Bu yaklaşımın avantajı, bir model dosyasını sürdürmenize gerek olmamasıdır.

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)