Beego使用Casbin进行权限管理(MySQL)入门
前言
网上关于Casbin
的教程都比较麻烦,上手难度大,此篇仅供初学者学习,主要是将晦涩难懂的原理简单化,下面将分为8个知识点来应用Casbin
访问控制框架。这里不对Casbin
原理进行详细解释,如果想学习,请访问Casbin技术文档
名词理解
- Model : 权限模型(例如ACL、RBAC、ABAC等)
- Adapter : 链接框架和数据库的中间件
- request(r ) : 用户提供的信息
- policy(p ) : 规则提供的信息(基本上规则要什么,用户就要给什么)
- g(role) : 角色匹配( _ , _就表示前者继承后者)
- subject(sub) : 对象(用户名或者角色)
- object(obj) : 资源(路径,如
/user/1
) - action(act) : 操作(方式,如
GET
、POST
等) - Matchers : 规则(计算布尔值的计算公式)
1.安装
下载Casbin
的访问控制框架和beego-ORM-Adapter
go get github.com/casbin/casbin
go get github.com/casbin/beego-orm-adapter
实际上作者提供的beego-ORM-Adapter
包比较难用,需要自己重写。
2.配置
在conf
文件夹中新建casbin.conf
,内容如下:
conf/casbin.conf
[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) && keyMatch2(r.obj, p.obj) && regexMatch(r.act, p.act)
然后假设我们Beego已经注册好MySQL链接,如下所示:
err := orm.RegisterDataBase("default", "mysql", dbLink, maxIdle, maxConn)
那么我们就不需要beego-ORM-Adapter
原本提供的数据库注册,所以需要魔改。
3.Casbin数据库模型
先抛下魔改的部分,我们得先创建Casbin
对应的数据库表,这个表的建立很简单,直接写一个结构体,包含以下
models/Casbin.go
type CasbinRule struct {
Id int // 自增主键
PType string // Policy Type - 用于区分 policy和 group(role)
V0 string // subject
V1 string // object
V2 string // action
V3 string // 这个和下面的字段无用,仅预留位置,如果你的不是
V4 string // sub, obj, act的话才会用到
V5 string // 如 sub, obj, act, suf就会用到 V3
}
然后直接通过orm注册模型,并migrate到数据库中,这个和其他模型一样
models/Casbin.go
func init(){
orm.RegisterModel(new(CasbinRule))
_ = orm.RunSyncdb("default", false, false)
}
4.Adapter
为什么要自己修改一个
Adapter
?
我们看一下beego-ORM-Adapter
中NewAdapter
方法源码(部分)
func NewAdapter(driverName string, dataSourceName string, dbSpecified ...bool) *Adapter {
a := &Adapter{
}
a.driverName = driverName
a.dataSourceName = dataSourceName
.....
// Open the DB, create it if not existed.
// 打开一个Database链接,如果不存在
a.open()
.....
return a
}
func (a *Adapter) open() {
.....
err = a.registerDataBase("default", a.driverName, a.dataSourceName)
if err != nil {
panic(err)
}
.....
a.o = orm.NewOrm()
a.o.Using("casbin&#