Golang Beego使用Casbin进行Restful Api权限管理教程

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) : 操作(方式,如GETPOST等)
  • 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-AdapterNewAdapter方法源码(部分)

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&#
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值