RBAC with Pattern
快速开始
在
g(_, _)中使用模式。e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)使用带有域的模式。
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)使用所有模式。
只需结合使用两个API。
如上所示,创建 enforcer 实例后,您需要通过 AddNamedMatchingFunc 和 AddNamedDomainMatchingFunc API激活模式匹配,这些API决定了模式如何匹配。
If you use the online editor, You can add a pattern matching function by clicking the "Add Role Matching" button in the lower left corner.

在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 1 和 book 2。 但可能有数千本书,将每本书都添加到书籍角色(或组)中是非常繁琐的,每个 g 策略规则都需要添加一本书。
但是,使用模式匹配函数,您只需要用一行代码就可以编写策略:
g, /book/:id, book_group
Casbin 将自动为您将 /book/1 和 /book/2 匹配到模式 /book/:id 中。 您只需要像这样向执行器注册函数:
- Go
- Node.js
e.AddNamedMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
在域/租户中使用模式匹配函数时,您需要向执行器和模型注册函数。
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g", "KeyMatch2", util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
如果你不明白 g(r.sub, p.sub, r.dom) 是什么意思,请阅读 带域的rbac。 简单来说,g(r.sub, p.sub, r.dom) 将检查用户 r.sub 是否在域 r.dom 中具有角色 p.sub。 所以这就是匹配器的工作方式。 你可以在这里看到完整的示例。
除了上面的模式匹配语法,我们还可以使用纯域模式。
例如,如果我们希望 sub 在不同的域,domain1 和 domain2 中都有访问权限,我们可以使用纯域模式:
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中读取和写入data。 g中的模式匹配*使alice能够访问两个域。
通过使用模式匹配,特别是在更复杂的场景中,需要考虑很多域或对象,我们可以以更优雅和有效的方式实现policy_definition。