第
Golang利用casbin实现权限验证详解
目录导语Casbin是什么实现思路
导语
学习一下golang权限控制,保留一下demo代码作为参考
Casbin是什么
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型,Casbin只负责访问控制。
其功能有:
支持自定义请求的格式,默认的请求格式为{subject,object,action}。具有访问控制模型model和策略policy两个核心概念。支持RBAC中的多层角色继承,不止主体可以有角色,资源也可以具有角色。支持内置的超级用户例如:root或administrator。超级用户可以执行任何操作而无需显式的权限声明。支持多种内置的操作符,如keyMatch,方便对路径式的资源进行管理,如/foo/bar可以映射到/foo*
实现思路
packagemain
import(
fmt
/casbin/casbin/v2
gormadapter/casbin/gorm-adapter/v3
_/go-sql-driver/mysql
funcmain(){
//e,err:=casbin.NewEnforcer(model.conf,policy.csv)//本地policy
a,_:=gormadapter.NewAdapter(mysql,root:pass@tcp(localhost:3306)/casbincharset=utf8mb4parseTime=Trueloc=Local,true)//数据库policy
e,_:=casbin.NewEnforcer(./model.conf,a)//model依旧放本地没有必要放数据库把a变成了适配器存到了数据库
//LoadthepolicyfromDB.
e.LoadPolicy()
//Checkthepermission.
e.Enforce(alice,data1,read)
//Modifythepolicy.
//e.AddPolicy(...)
//e.RemovePolicy(...)
//SavethepolicybacktoDB.
e.SavePolicy()
sub:=alice//想要访问资源的用户
obj:=data1//将要被访问的资源
act:=read//用户对资源实施的操作
//added,err:=e.AddPolicy(alice,data1,read)//added返回是bool类型
//fmt.Println(added)
//fmt.Println(err)
//iferr!=nil{
////处理错误
//fmt.Printf(%s,err)
ok,err:=e.Enforce(sub,obj,act)
iferr!=nil{
//处理错误
fmt.Printf(%s,err)
ifok==true{
//允许alice读取data1
fmt.Println(通过)
}else{
//拒绝请求,抛出异常
fmt.Println(未通过)
//您可以使用BatchEnforce()去批量处理一些请求。
//这个方法返回一个布尔类型的切片,切片的下标对应二位数组的行标
//例如results[0]是{alice,data1,read}的结果
//results,err:=e.BatchEnforce([][]interface{}{{alice,data1,read},{bob,data2,write},{jack,data3,read}})
}
packagemain
import(
fmt
/casbin/casbin/v2
gormadapter/casbin/gorm-adapter/v3
_/go-sql-driver/mysql
funcmain(){
//e,err:=casbin.NewEnforcer(model.conf,policy.csv)//本地policy
a,_:=gormadapter.NewAdapter(my