与 policy 不同,model 只能加载,不能保存。 因为我们认为 model 不是动态组件,不应该在运行时进行修改,所以我们没有实现一个 API 来将 model 保存到存储中。

然而,好消息是,我们提供了几种静态或动态加载 model 的方法:

从 .CONF 文件中加载 model

当你向 Casbin 团队寻求帮助时,他们会给你这个 Casbin 最常用的方法,此方法对于初学者来说很容易理解并且便于分享。

  1. ```go
  2. e := casbin.NewEnforcer("examples/basic_model.conf", "examples/basic_policy.csv")
  3. ```

从代码加载 model

可以从代码中动态地初始化 model, 而不是使用 .CONF 文件。下面是 RBAC model 的一个示例:

  1. // 使用 Go 代码初始化 model
  2. m := casbin.NewModel()
  3. m.AddDef("r", "r", "sub, obj, act")
  4. m.AddDef("p", "p", "sub, obj, act")
  5. m.AddDef("g", "g", "_, _")
  6. m.AddDef("e", "e", "some(where (p.eft == allow))")
  7. m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")
  8. // 从 .CSV 文件 adapter 中加载 policy 规则。
  9. // 使用自己的 adapter 替换
  10. a := persist.NewFileAdapter("examples/rbac_policy.csv")
  11. // 创建一个 enforcer。
  12. e := casbin.NewEnforcer(m, a)

从字符串加载的 model

或者你可以从一个单独的字符串得到 model:

  1. // 使用字符串初始化 model
  2. text :=
  3. `
  4. [request_definition]
  5. r = sub, obj, act
  6. [policy_definition]
  7. p = sub, obj, act
  8. [role_definition]
  9. g = _, _
  10. [policy_effect]
  11. e = some(where (p.eft == allow))
  12. [matchers]
  13. m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
  14. `
  15. m := NewModel(text)
  16. // 从 .CSV 文件 adapter 中加载 policy 规则。
  17. // 使用自己的 adapter 替换。
  18. a := persist.NewFileAdapter("examples/rbac_policy.csv")
  19. // 创建一个 enforcer。
  20. e := casbin.NewEnforcer(m, a)

以上的两种方式相当于以下的 Casbin 常用方法:

examples/rbac_model.conf:

  1. [request_definition]
  2. r = sub, obj, act
  3. [policy_definition]
  4. p = sub, obj, act
  5. [role_definition]
  6. g = _, _
  7. [policy_effect]
  8. e = some(where (p.eft == allow))
  9. [matchers]
  10. m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
  1. e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")

原文: https://casbin.org/docs/zh-CN/model-storage