跳转至主要内容

RBAC with Pattern

快速开始

  • g(_, _) 中使用模式。

    e, _ := NewEnforcer("./example.conf", "./example.csv")
    e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
  • 使用带有域的模式。

    e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
  • 使用所有模式。

    只需结合使用两个API。

如上所示,创建 enforcer 实例后,您需要通过 AddNamedMatchingFuncAddNamedDomainMatchingFunc API激活模式匹配,这些API决定了模式如何匹配。

备注

如果您使用在线编辑器,它会在左下角指定模式匹配函数。 editor-tips

在RBAC中使用模式匹配

有时,您希望具有特定模式的某些主题、对象或域/租户自动被授予角色。 RBAC中的模式匹配函数可以帮助您做到这一点。 模式匹配函数与之前的 匹配函数 具有相同的参数和返回值。

模式匹配函数支持 g 的每个参数。

我们知道,通常RBAC在匹配器中表示为 g(r.sub, p.sub)。 然后我们可以使用像这样的策略:

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

所以 alice 可以阅读所有书籍,包括 book 1book 2。 但可能有数千本书,将每本书都添加到书籍角色(或组)中是非常繁琐的,每个 g 策略规则都需要添加一本书。

但是,使用模式匹配函数,您只需要用一行代码就可以编写策略:

g, /book/:id, book_group

Casbin 将自动为您将 /book/1/book/2 匹配到模式 /book/:id 中。 您只需要像这样向执行器注册函数:

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

在域/租户中使用模式匹配函数时,您需要向执行器和模型注册函数。

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

如果你不明白 g(r.sub, p.sub, r.dom) 是什么意思,请阅读 带域的rbac。 简单来说,g(r.sub, p.sub, r.dom) 将检查用户 r.sub 是否在域 r.dom 中具有角色 p.sub。 所以这就是匹配器的工作方式。 你可以在这里看到完整的示例。

除了上面的模式匹配语法,我们还可以使用纯域模式。

例如,如果我们希望 sub 在不同的域,domain1domain2 中都有访问权限,我们可以使用纯域模式:

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能够在domain1和domain2中读取和写入datag中的模式匹配*使alice能够访问两个域。

通过使用模式匹配,特别是在更复杂的场景中,需要考虑很多域或对象,我们可以以更优雅和有效的方式实现policy_definition