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决定了模式如何匹配。
如果您使用在线编辑器,它会在左下角指定模式匹配函数。
在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
。