我用带有rabc的容器和资源模型,这是我的产品:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
g2 = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && g2(r.obj, p.obj) &&(r.act == p.act这是一项政策:
p, data_group_admin, data_group, write
g, alice, data_group_admin
g2, /api/:id, data_group这是请求:
alice, /api/1, read
alice, /api/2, write结果是假,假实际上,我期望结果是真,真,我想资源可以支持restful格式,如何设置conf?
发布于 2020-06-21 16:12:45
您可以使用AddMatchingFunc使默认角色管理器知道如何传播角色链接,因为在默认情况下,它准确地比较角色名称。
示例代码可能如下所示
e.GetRoleManager().(*defaultrolemanager.RoleManager).AddMatchingFunc('matcher', util.KeyMatch)有关更多信息,您可以看到https://github.com/casbin/casbin/blob/master/rbac/default-role-manager/role_manager.go#L163
更新后,添加示例代码
package main
import (
"github.com/casbin/casbin/v2"
defaultrolemanager "github.com/casbin/casbin/v2/rbac/default-role-manager"
"github.com/casbin/casbin/v2/util"
)
func main() {
e, _ := casbin.NewEnforcer("./model.conf", "./policy.csv")
e.GetRoleManager().(*defaultrolemanager.RoleManager).AddMatchingFunc("key_match", util.KeyMatch2)
res1, _ := e.Enforce("alice", "/api/1", "write") // true
res2, _ := e.Enforce("alice", "/api/2", "read") // false
}这将是正确的,因为alice属于data_group_admin,/api/1属于data_group,data_group_admin可以编写data_group
因为您没有定义读取策略,所以第二个强制执行将返回false。
发布于 2021-02-03 03:44:10
照我的想法。
g2, /api/:id, data_groupg2需要两个子,而不是obj和sub。
我的意思是:如果你想要爱丽丝可以访问你需要的/api/1:
p: alice, /api/1, read
p: alice, /api/2, write或者:
p: data_group_admin, /api/1, read
p: data_group_admin, /api/2, write
g: alice, data_group_admin摘要:区分sub和obj在r,p和g。
https://stackoverflow.com/questions/62499629
复制相似问题