メインコンテンツにスキップ

モデル ストレージ

Unlike the policy, the model can only be loaded, it cannot be saved. We believe that the model is not a dynamic component and should not be modified at runtime, so we have not implemented an API to save the model into storage.

However, there is good news. We provide three equivalent ways to load a model, either statically or dynamically:

.CONFファイルからモデルを読み込む

これはCasbinを使用する最も一般的な方法です。 It is easy to understand for beginners and convenient for sharing when you need help from the Casbin team.

The content of the .CONF file examples/rbac_model.conf is as follows:

[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

Then you can load the model file as follows:

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

コードからモデルを読み込む

The model can be initialized dynamically from code instead of using a .CONF file. 以下はRBACモデルの例です。

import (
"github.com/casbin/casbin/v2"
"github.com/casbin/casbin/v2/model"
"github.com/casbin/v2/persist/file-adapter"
)

// Goコードからモデルを初期化する
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")

// 執行者を作成します。
e := casbin.NewEnforcer(m, a)

文字列からモデルを読み込む

Alternatively, you can load the entire model text from a multi-line string. The advantage of this approach is that you do not need to maintain a model file.

import (
"github.com/casbin/casbin/v2"
"github.com/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")

// 執行者を作成します。
e := casbin.NewEnforcer(m, a)