RBAC with Pattern
快速入门
在
g(_,_) 中使用模式
e, _ := NewEnforcer("./example.conf", "./example.csv")
e.AddNamedMatchingFunc("g","KeyMatch2",util.KeyMatch2)使用域名的模式
e.AddNamedDomainMatchingFunc("g","KeyMatch2",util.KeyMatch2)
使用所有模式
仅使用两个APIs
As shown above, after you create the enforcer
instance, you need to activate pattern matching via AddNamedMatchingFunc
and AddNamedDomainMatchingFunc
API, which determine how the pattern matches.
如果您使用在线编辑器,它会在左下角指定模式匹配函数。
在 RBAC 中使用模式匹配
有时,您希望一些具有特定模式的subjects, object 或者 domains/tenants能够被自动授予角色。 RBAC中的模式匹配函数可以帮助做到这一点。 模式匹配函数与前一个函数共享相同的参数和返回值:matcher function。
模式匹配函数支持g的每一个参数
我们知道,在matcher里面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
。 您需要做的仅仅是向enforcer注册该方法,例如像这样:
- Go
- Node.js
e.AddNamedMatchingFunc("g","KeyMatch2",util.KeyMatch2)
await e.addNamedMatchingFunc('g', Util.keyMatch2Func);
当在domains/tenants里面使用模式匹配函数的时候,你需要把这个函数向enfoecer以及model进行注册
- Go
- Node.js
e.AddNamedDomainMatchingFunc("g","KeyMatch2",util.KeyMatch2)
await e.addNamedDomainMatchingFunc('g', Util.keyMatch2Func);
如果您不理解 g(r.sub, p.sub, r.dom)
意味着什么,请阅读 rbac-with-domins。 简而言之, 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, 模式匹配 *
在 g
中,让 alic
可以访问两个域。
通过使用模式匹配, 尤其是在更加复杂和我们需要考虑的大量域或对象的情况下, 我们可以执行 policy_definition
更加美雅和有效。