多应用+插件架构,代码干净,二开方便,首家独创一键云编译技术,文档视频完善,免费商用码云13.8K 广告
# Model存储 与 policy 不同,model 只能加载,不能保存。 因为我们认为 model 不是动态组件,不应该在运行时进行修改,所以我们没有实现一个 API 来将 model 保存到存储中。 但是,好消息是,我们提供了三种等效的方法来静态或动态地加载模型: ## 从 .CONF 文件中加载 model 当你向 Casbin 团队寻求帮助时,他们会给你这个 Casbin 最常用的方法,此方法对于初学者来说很容易理解并且便于分享。 `.CONF`文件的内容[examples/rbac\_model.conf](https://github.com/casbin/casbin/blob/master/examples/rbac_model.conf): ~~~ini [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 ~~~ 接着你可以加载模型文件如下: ~~~go e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv") ~~~ ## 从代码加载 model 模型可以从代码中动态初始化,不需要使用`.CONF`。下面是RBAC模型的一个例子: ~~~go // 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. // 使用自己的 adapter 替换。 a := persist.NewFileAdapter("examples/rbac_policy.csv") // 创建一个 enforcer。 e := casbin.NewEnforcer(m, a) ~~~ ## 从字符串加载的 model 或者您可以从多行字符串加载整个模型文本。这种方法的优点是您不需要维护模型文件。 ~~~go // 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 := NewModel(text) // Load the policy rules from the .CSV file adapter. // Replace it with your adapter to avoid files. a := persist.NewFileAdapter("examples/rbac_policy.csv") // Create the enforcer. e := casbin.NewEnforcer(m, a) ~~~