GO 权限管理之 Casbin
我们来回顾一下上次分享的 GO中 gjson
库的应用和分享,它主要是提供了一种非常快速且简单的方式从json
文档中获取相应值
- 分享了
json
与gjson
分别代表什么 gjson
的简单使用gjson
校验,获取值gjson
的json 行
gjson
的键路径匹配规则gjson
的修饰符和自定义修饰符
要是对 gjson
还有点兴趣的话,可以查看文章 GO中gjson的应用和分享
今天咱们来分享一下 GO里面的权限管理,Casbin
权限管理是什么?
一般指根据系统设置的安全规则或者安全策略
用户可以访问而且只能访问自己被授权的资源,不多不少刚刚好
权限管理几乎出现在任何系统里面
我们可能会把 用户身份认证
、 密码加密
、 系统管理
与权限管理弄混淆,那么他们具体的侧重点是什么呢?
- 用户身份认证
不属于权限管理范畴
用户身份认证指的是通过某种凭证来证明自己的身份,例如账号密码,指纹,人脸识别等等
- 系统管理
是系统中的一个模块,该模块一般还含有权限管理子模块 , 该模块相当于给权限管理模块提供了一些数据
- 密码加密
也是不属于权限管理范畴 , 他只是用户身份认证领域的一个部分
Casbin 是个啥?
是 GO 项目的功能强大且高效的开源访问控制库,casbin
支持常用的多种访问控制模型,例如:
RBAC
ABAC
ACL
使用casbin
来做权限管理有一个比较好的地方是,casbin
是支持多种语言的,就像protobuf一样也是支持多种语言
咱们来看看 Casbin 有啥特性
- 实施策略是这样子的
{subject, object, action}
,
我们也可以自定义,同时他支持允许授权和拒绝授权
- 他可以处理访问控制模型以及其存储对应的策略
- 在
RBAC
中的角色层次结构 中,他可以管理角色用户映射和角色角色映射 - 他支持内置的超级用户
如root
或administrator
- 支持多个内置运算符规则匹配
例如 hello/world
,就可以将其映射到 hello*模式
- 不支持身份验证
- 不支持管理用户或角色列表
咱们看一下 Casbin
的基本模型
在 Casbin
库中,他是基于PERM
元模型将访问控制模型抽象为CONF文件,有如下4个部分
- 策略
- 效果
- 请求
- 匹配器
一起来了解一个最简单的模型,ACL
的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) && r.obj == p.obj && r.act == p.act
例如一个ACL
模型的示例策略
p, xiaomt, data1, read
p, xiaomt, data2, write
咱们来写一个DEMO
main.go
文件写gin
对应的接口以及casbin
的使用rbac_models.conf
RBAC CONF文件
咱们写一个路由,里面添加一个拦截器,再写一个接口/api/v1/hello
,使用GET方法验证效果
package main
import (
"fmt"
"log"
"github.com/casbin/casbin"
xd "github.com/casbin/xorm-adapter"
"github.com/gin-gonic/gin"
_ "github.com/go-sql-driver/mysql"
)
// myAuth 拦截器</