Casbin
1. Casbin 是什么
Casbin是一个使用Go语言打造的轻量级开源访问控制框架,支持多种经典的访问控制方案,比如基于属性的访问控制ABAC
2. Casbin的主要特性
- 支持自定义请求的格式,默认的请求格式为{subject,object,action};
- 具有访问控制模型model和策略policy两个核心概念;
- 支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色
- 支持超级用户,如root或Administrator,超级用户可以不受授权策略的约束访问任意资源
- 支持多种内置的操作符,如keyMatch,方便对路径式的资源进行管理,如/foo/bar 可以映射到/foo*;
3.Casbin的ABAC测试使用
需要先初始化模型文件和策略文件
模型文件初始化如下
[request_definition]
r = sub, obj, act #
[policy_definition]
p = sub, obj, act
# 策略
[matchers]
m = r.sub.Hour >= 9 && r.sub.Hour < 18 && r.sub.Trust > 60 || r.sub.Name == r.obj.Owner && r.sub.Trust > 50 || r.sub.Trust >= 80
[policy_effect]
e = some(where (p.eft == allow))
策略文件为空即可
测试
type Object struct { //资源
Name string
Owner string
}
type Subject struct { //申请者
Name string
Hour int
Trust int
}
func check(e *casbin.Enforcer, sub Subject, obj Object, act string) {
ok, err := e.Enforce(sub, obj, act) //判断的函数
if err != nil {
log.Fatal("Enforce Error",err)
}
if ok {
fmt.Printf("%s CAN %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
} else {
fmt.Printf("%s CANNOT %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
}
}
func main() {
e, err := casbin.NewEnforcer("./model.conf", "./policy.csv") //通过model.conf 和policy.csv来创建对象
if err != nil {
log.Fatalf("NewEnforecer failed:%v\n", err)
}
o := Object{"data", "dsy"} //实例化资源对象o
s1 := Subject{ //实例化访问者对象
Name :"dajun",
Hour : 10,
Trust: 80,
}
check(e, s1, o, "read") //调用check函数进行判断
s2 := Subject{
Name :"dsy",
Hour : 10,
Trust: 60,
}
check(e, s2, o, "read")
s3 := Subject{
Name :"dsy",
Hour : 20,
Trust: 40,
}
check(e, s3, o, "read")
s4 := Subject{
Name :"wkh",
Hour : 10,
Trust: 70,
}
check(e, s4, o, "read")
}
定义访问者的三个属性,分别为Name,Trust和Hour,通过Model指定只有特定的Name、Hour和Trust组合才能够对资源进行访问