跳转到主要内容

带模式匹配的 RBAC

快速上手​

  • 不带域 — 为 g 注册一个匹配函数:

    e, _ := NewEnforcer("./example.conf", "./example.csv")
    e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
  • 带域 — 使用支持域的 API:

    e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
  • 两者都用 — 如果你的模型在用户—角色匹配和域匹配中都使用了模式,请同时调用这两个 API。

这些调用必须在创建 enforcer 之后进行;它们定义了模式匹配如何求值。

备注

如果使用在线编辑器,可以通过点击左下角的 "Add Role Matching" 按钮来添加模式匹配函数。 editor-tips

模式匹配如何工作​

模式匹配让 一条 策略行就能匹配许多 subject、object 或域(例如 /book/:id 匹配 /book/1、/book/2)。这些函数与 matcher 函数 签名相同;你需要为 g 的参数注册它们。

示例:不使用模式匹配时,你可能会这样写:

p, alice, book_group, read
g, /book/1, book_group
g, /book/2, book_group

这样 alice 可以读每一本书,但你需要为每本书写一行 g。当书很多时,可以改用 模式:

g, /book/:id, book_group

这样 Casbin 就会把 /book/1、/book/2 等匹配到 /book/:id。注册匹配函数:

e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

对于 域 模式匹配(例如 g(r.sub, p.sub, r.dom)),请使用:

e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)

关于 g(r.sub, p.sub, r.dom) 的含义请见 带域的 RBAC。完整示例:model_test.go。

备注

带域的模式匹配支持自定义域名称。除了 dom,你可以使用任何标识符,例如 tenant 或 workspace。当使用 keyMatch 这类模式匹配函数时,Casbin 会自动从你的模型定义中检测出域的名称。

域通配符: 你可以在 g 的域位置使用通配符,以在所有域中授予某个角色。示例:

p, admin, domain1, data1, read
p, admin, domain1, data1, write
p, admin, domain2, data2, read
p, admin, domain2, data2, write

g, alice, admin, *
g, bob, admin, domain2

这样 alice 在每个域中都拥有 admin 角色(*),而 bob 只在 domain2 中是 admin。当你有许多域或资源时,模式匹配和域通配符能让策略保持精简。