Casbin是什么?
我们最终想要实现的效果:
配置文件有两个:model file和policy file,分别用是访问控制模型文件和权限注册表
# Request definition 定义了请求的格式
[request_definition]
r = sub, obj, act
# Policy definition 定义了权限的格式
[policy_definition]
p = sub, obj, act
# Policy effect 定义了什么情况下这个请求是被允许的
[policy_effect]
e = some(where (p.eft == allow))
# Matchers //定义了如何将请求和权限相匹配
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
Casbin使用PERM来描述一种模型(Policy、Effect、Request、Matcher),其中:
p, bob, data2, write
p, alice, data1, read
p, alice, data1, write
p, alice, data2, read
第一行定义了一个权限,表明一个叫Alice的用户/组可以对data1这个资源进行read操作
例如:用户Alice想要read一下data1
由于在model file中我们定义了请求的格式,所以我们这次的请求应该写为 alice,data1,read,分别对应了 r.sub、r.obj、 r.act
在model file中我们也定义了policy的格式,所以当我们从policy file中读取出一行权限时,分别对应着p.sub、p.obj、p.act
根据matcher所定义的规则,将请求与权限进行匹配,若某policy匹配成功,则p.eft = allow
r.sub == p.sub 满足条件的有三条权限(2、3、4 )
r.obj == p.obj 剩下的三条权限中满足条件的有两条(2,3)
r.act == p.act 剩下的两条权限中满足条件的有一条(2)
根据policy_effect定义的规则返回最终结果,此处定义的规则为:任意一条policy匹配成功,则返回allow
最后,Alice如愿read到了data1
用户alice和bob同属于一个名为admin的角色(分组),而admin角色可以对 “/v1”路径下的所有资源进行任何操作!
model file:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")
policy file:
p, admin, /v1/*, *
g, alice, admin
g, bob, admin
加一个超级管理员?
[matchers]
m = g(r.sub, p.sub) && keyMatch(r.obj, p.obj) && (r.act == p.act || p.act == "*")|| r.sub == "root"
在[role_definition]中,g有两种不同的写法:
g = _, _ 表示用户,角色
g2 = _, _, _ 表示用户,角色,域
Model的三种加载方式
e := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")
从代码中加载:
// Initialize the model from Go code.
m := casbin.NewModel()
m.AddDef("r", "r", "sub, obj, act")
m.AddDef("p", "p", "sub, obj, act")
m.AddDef("g", "g", "_, _")
m.AddDef("e", "e", "some(where (p.eft == allow))")
m.AddDef("m", "m", "g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act")
// Load the policy rules from the .CSV file adapter.
// 使用自己的 adapter 替换。
a := persist.NewFileAdapter("examples/rbac_policy.csv")
// 创建一个 enforcer。
e := casbin.NewEnforcer(m, a)
从字符串中加载
// Initialize the model from a string.
text :=
`
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[role_definition]
g = _, _
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
`
m := NewModel(text)
// Load the policy rules from the .CSV file adapter.
// Replace it with your adapter to avoid files.
a := persist.NewFileAdapter("examples/rbac_policy.csv")
// Create the enforcer.
e := casbin.NewEnforcer(m, a)
Matcher中的函数
matcher内置了若干个函数来支持开发者更好的定制自己的模型,甚至可以使用我们自定义的函数。当前支持的函数如下:
函数 释义
keyMatch(arg1, arg2) arg1为URL,如 /v1/admin/filerag2为URL或 模板,如:/v1/admin/返回arg1是否与arg2相匹配
keyMatch2(arg1, arg2) arg1为URL,如 /v1/admin/file2rag2为URL或 : 模板,如:/v1/admin/:file返回arg1是否与arg2相匹配
regexMatch(arg1, arg2) arg1为任意字符串,arg2为正则表达式返回arg1是否与arg2相匹配
ipMatch(arg1, arg2) arg1为IP地址 如 192.168.12.42arg2为iP地址或CIDR,如 192.168.12. 0/24返回arg1是否与arg2相匹配
添加自定义函数见 自定义函数
Casbin API (带注释)
权限系统设计模型分析
见文档【权限系统设计模型分析】
更多信息
Casbin使用PERM的方式来描述模型,这使得我们可以灵活的自定义出更加适合自己项目的访问控制模型。
在[matchers]中,Casbin还提供了一些函数以方便匹配(如例1中使用的keyMatch(arg1, arg2))
手机扫一扫
移动阅读更方便
你可能感兴趣的文章