今天学了一下casbin,对caspin的怎么匹配的有了心得,我自己的理解,相关资料也没有查询,只是为了把我的想法在此记录下来
文档地址:https://casbin.org/docs/zh-CN/overview
引用一下https://juejin.im/post/6844904191257739277#heading-1该文档的例子,我也是根据这个学的。
我们首先编写模型文件:
model.conf
[request_definition] //接收器,代码里调用e.Enforce(sub, obj, act)的时候,会把值赋给这几个参数
r = sub, obj, act
[policy_definition]//匹配器,用cvs文件赋值
p = sub, obj, act
[matchers]//匹配方法
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
[policy_effect]//匹配的结果通过p.eft获取,some(where (p.eft == allow))表示只要有一条策略允许即可。
e = some(where (p.eft == allow))
然后我们策略文件(即谁能对什么资源进行什么操作):
policy.csv
p, dajun, data1, read
p, lizi, data2, write
上面policy.csv文件的两行内容表示dajun对数据data1有read权限,lizi对数据data2有write权限。
然后代码
package main
import (
"fmt"
"log"
"github.com/casbin/casbin/v2"
)
func check(e *casbin.Enforcer, sub, obj, act string) {
ok, _ := e.Enforce(sub, obj, act)
if ok {
fmt.Printf("%s CAN %s %s\n", sub, act, obj)
} else {
fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
}
}
func main() {
e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
if err != nil {
log.Fatalf("NewEnforecer failed:%v\n", err)
}
check(e, "dajun", "data1", "read")
check(e, "lizi", "data2", "write")
check(e, "dajun", "data1", "write")
check(e, "dajun", "data2", "read")
}
代码其实不复杂。首先创建一个casbin.Enforcer对象,
加载模型文件model.conf和策略文件policy.csv,
调用其Enforce方法来检查权限。
运行程序的结果:
dajun CAN read data1
lizi CAN write data2
dajun CANNOT write data1
dajun CANNOT read data2
这里看一下是如何判断的,以第一条为例
调用check(e, "dajun", "data1", "read"),配置文件写着r = sub, obj, act,此时,r = dajun,data1,read,把参数赋值给r
然后根据匹配规则做判断 m = r.sub == p.sub && r.obj == p.obj && r.act == p.act是否为true,因为policy.csv文件配置了2条策略,所以会依次做判断。
比如第一条策略是 p, dajun, data1, read。那么判断就是r.dajun == p.dajun&&r.data1==p.data1&&r.read == p.read,结果就是true