跳转至主要内容

RBAC with Pattern

快速开始​

  • 不带域:为 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

模式匹配的工作原理​

模式匹配让 一条 策略就能匹配多个主体、对象或域(例如 /book/:id 匹配 /book/1、/book/2)。这些函数与 匹配器函数 使用相同的签名;你把它们注册给 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。

备注

带域的模式匹配支持自定义域名称。可以用 tenant 或 workspace 等任意标识代替 dom。使用 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。域或资源很多时,模式匹配和域通配符能让策略保持简短。

Comments are powered by giscus and GitHub Discussions. They load from giscus.app and GitHub only after you click the button below.