本文主要是介绍casbin 权限管理库介绍 (规范实现 acl, rbac,abac)等,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
Casbin介绍
日常开发中我们经常需要设计用户对资源的访问权限控制。我发现手动设计模型、数据库表定义很不规范, 所以进行了一些调研。我发现casbin这个库很大程度上实现了标准化的需求, 牛刀小试引入了公司的一个需求中, 感觉开发效率确实很高, 所以博客分享一下。
Casbin是一款开源的访问控制框架,它使用简单的表达式语言来定义各种访问控制模型(RBAC)和访问控制策略。开发人员可以使用这些策略来限制用户对系统中的资源的访问。
优点:
- 灵活性高:支持实现各种访问控制模型(RBAC、ABAC等),模型升级方便
- 规范化:避免手工编码权限规则和策略,无需从头设计数据库表结构,可以使用适配器将访问策略保存到mysql、redis、etcd等
- 多语言支持 : Go, python, node, Java, etc
- 支持规则匹配符(匹配路由等)
- 支持多层角色继承
- 支持多租户: 如将工作空间视为一个租户
- 前后端一致
不足:
- 规则书写没有可视化编辑界面、需要手动对双引号进行转义等
ACL模型
模型文件定义如下
# model.conf 文件
[request_definition]
r = sub, obj,act
# 请求格式定义,表示sub对obj执行act, 定义 Enforce 请求授权函数的参数[policy_definition]
p = sub, obj, act
# 策略格式定义, 和策略文件中的策略对应[policy_effect]
e = some(where (p.eft == allow))
# 表示当多个策略匹配请求时, 怎么确定是否允许访问
# 这里 e = some(where (p.eft == allow))表示只要有一条策略允许访问, 最终的结果就是允许[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
# 匹配器,当执行访问请求时,匹配对应的策略
创建策略文件
# policy.csv
p, alice, data1, read
p, bob, data2, write
这个策略文件定义了两个规则。第一个规则指定Alice可以读取data1,第二个规则指定Bob可以写入data2。
加载策略文件
e, err := casbin.NewEnforcer("path/to/policy/file", "path/to/model/file")
这将创建一个新的Casbin实例,并将策略文件和模型文件加载到该实例中。
检查访问权限
下面的代码将检查Alice是否有权读取data1:
if e.Enforce("alice", "data1", "read") {fmt.Println("Alice can read data1")
} else {fmt.Println("Alice cannot read data1")
}
这将输出“Alice can read data1”,因为Alice在策略文件中被授权读取data1。
修改策略
added := e.AddPolicy('eve', 'data3', 'read')
e.SavePolicy()
这将策略保存当前策略文件
RBAC 模型
RBAC只需要在模型中增加 role_definition及修改对应匹配器
[role_definition]
g = _, _
# 第一个_表示用户,第二个_表示角色
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
# g(r.sub, p.sub) 表示 请求的 sub的角色 和 策略中的sub匹配
策略此时可以写成
p, admin, data1, read
r, alice, admin
表示alice是admin角色, 可以read data1
角色层次
Casbin 的 RBAC 支持 RBAC1 的角色层次结构功能,如果alice具有role1,role1具有role2,则alice也将拥有role2并继承其权限。
多租户
需要在模型增加 domain相关定义
模型文件定义如下
[request_definition]
r = sub, dom, obj, act[policy_definition]
p = sub, dom, obj, act[role_definition]
g = _, _, _
# 第三个 _ 表示域/租户的名称[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = g(r.sub, p.sub, r.dom) && r.dom == p.dom && r.obj == p.obj && r.act == p.act
策略文件相应改为
p, admin, tenant1, data1, read
p, admin, tenant2, data2, readg, alice, admin, tenant1
g, alice, user, tenant2
表示alice在tenant1内是admin角色, 可以read data1
管理api
casbin支持完善的RBAC 相关的API, 如新增角色、删除角色, 获取用户所有角色等 https://casbin.org/zh/docs/rbac-api
ABAC 模型
casbin也可以方便实现ABAC模型, 如下,如果申请者是obj的所有者, 可以做任意事情
[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 = r.sub.Name == r.obj.Owner
这里 r.sub 和 r.obj 都可以有自己的属性,使用ABAC时, 需要在 Enforce函数使用有属性的数据类, eg
class Task:def __init__(self, name, owner):self.Name = nameself.Owner = owner
task1 = Task('t1', 'alice')class User:def __init__(self, name):self.Name = namealice = User('alice')
bob = User('bob')
assert e.enforce(alice, task1, 'delete') == True
assert e.enforce(bob, task1, 'delete') == False
Model存储
一般从文件中直接读取, 不在运行时改变
Policy存储
可以通过适配器保存策略到mysql, redis, etcd等, 例如
a, _ := gormadapter.NewAdapter("mysql", "mysql_username:mysql_password@tcp(127.0.0.1:3306)/") // Your driver and data source.e, _ := casbin.NewEnforcer("examples/rbac_model.conf", a)
然后通过适配器API对策略进行管理
多实例同步
分布式同步服务多实例部署情况下可以使用 etcd, redis等进行同步策略变更 https://casbin.org/docs/watchers, eg
w, _ := etcdwatcher.NewWatcher([]string{"http://127.0.0.1:2379"}, "keyname")// Initialize the enforcer.
e, _ := casbin.NewEnforcer("examples/rbac_model.conf", "examples/rbac_policy.csv")// Set the watcher for the enforcer.
e.SetWatcher(w)
前端使用
在 auto模型下, 前端Casbin.js库可以使用后端提供的接口, 自动同步权限相关定义,从而保持一致
https://casbin.org/docs/frontend#advanced-usage
后端返回 CasbinJsGetUserPermission接口的数据, 文档说只有golang支持CasbinJsGetUserPermission, 但实际上python也已经支持, 其他语言未调查
管理平台casdoor
可以提供可视化界面集中管理所有的模型、策略、角色、用户等
https://casdoor.org/zh/docs/permission/permission-configuration
其他
源码: https://github.com/casdoor/casdoor
可编辑demo: https://demo.casdoor.com/
获取模型文件接口:https://demo.casdoor.com/swagger/#/Model%20API/ApiController.GetModel
这篇关于casbin 权限管理库介绍 (规范实现 acl, rbac,abac)等的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!