是否可以在 casbin 中通过模式将 p.obj 与角色匹配?
Is it possible to match p.obj with role by pattern in casbin?
这是我正在使用的model.conf:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act, eft
[role_definition]
g = _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = g(r.sub, p.sub) && g2(r.obj, p.obj) && regexMatch(r.act, p.act)
这是相关政策(用户可以阅读自己的posts,管理员可以阅读所有posts。):
p, admin, /posts/:id/attachments, GET, allow
p, alice, /posts/1/attachments, GET, allow
g, bob, admin
g2, /files/1.jpg, /posts/1/attachments
这些请求的结果预计为 true
:
alice, /files/1.jpg, GET
bob, /files/1.jpg, GET
目前,我可以通过添加规则 g, /posts/1/attachments, /posts/:id/attachments
使策略生效,但我想知道是否可以按模式匹配这些角色名称,这样我就不必创建规则每 post.
(我找到的最接近的例子是 AddNamedMatchingFunc("g","KeyMatch2",util.KeyMatch2)
方法,我尝试在 g2
上使用它,但它似乎只匹配 r.obj
上的模式和角色。)
g
的第二个参数不支持作为模式。但这里有一个使用多个 g
来产生相同效果的解决方法:
g, pattern1, role1
g, role1, pattern2
等同于:
g, pattern1, pattern2
这是我正在使用的model.conf:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act, eft
[role_definition]
g = _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow)) && !some(where (p.eft == deny))
[matchers]
m = g(r.sub, p.sub) && g2(r.obj, p.obj) && regexMatch(r.act, p.act)
这是相关政策(用户可以阅读自己的posts,管理员可以阅读所有posts。):
p, admin, /posts/:id/attachments, GET, allow
p, alice, /posts/1/attachments, GET, allow
g, bob, admin
g2, /files/1.jpg, /posts/1/attachments
这些请求的结果预计为 true
:
alice, /files/1.jpg, GET
bob, /files/1.jpg, GET
目前,我可以通过添加规则 g, /posts/1/attachments, /posts/:id/attachments
使策略生效,但我想知道是否可以按模式匹配这些角色名称,这样我就不必创建规则每 post.
(我找到的最接近的例子是 AddNamedMatchingFunc("g","KeyMatch2",util.KeyMatch2)
方法,我尝试在 g2
上使用它,但它似乎只匹配 r.obj
上的模式和角色。)
g
的第二个参数不支持作为模式。但这里有一个使用多个 g
来产生相同效果的解决方法:
g, pattern1, role1
g, role1, pattern2
等同于:
g, pattern1, pattern2