当前位置: 首页 > 科技观察

Python通用权限控制模块Casbin

时间:2023-03-14 09:24:44 科技观察

简介Casbin是一个强大高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。casbin的主要特性包括:支持自定义请求格式,默认请求格式为{subject,object,action};具有访问控制模型model和policy策略两个核心概念;RBAC支持多层角色继承,不仅subject可以有角色,resources也可以有角色;支持root或Administrator等超级用户,超级用户可以不受授权策略的限制访问任何资源;支持多种内置算子,比如keyMatch,方便基于路径的资源。管理,比如/foo/bar可以映射到/foo*;casbin不做的事情:authentication(即验证用户的用户名和密码),casbin只负责访问控制。应该有其他专门的组件负责身份认证,然后通过casbin进行访问控制,两者是协作关系;managementuserlistorrolelistcasbin认为由项目自己管理用户和角色列表更合适,casbin假定所有策略请求中出现的用户、角色和资源都是合法有效的。我为什么要使用Casbin?在我做过的这么多项目中,权限的处理往往是一件很头疼的事情,而且每个项目都有不同的权限控制方式。一直在想有没有一个通用的权限控制框架,可以应用多种不同的权限控制,每个项目只要简单修改一下就可以完全应用,直到无意中看到了casbin库。目前我只是初步尝试使用,所以这里只做一个简单的使用记录,记录一下我在项目中使用的东西,以供自己进一步研究和使用。对于想要使用这个库的pythoner来说也算是一个范例吧。官方文档地址:https://casbin.org/docs/zh-CN/overview官方提供了一个非常好的编辑器,可以让我们直接体验和测试casbin的权限处理。我们简单用官方的例子来说明。首先,policy配置了权限策略。从权限策略可以看出,用户alice拥有角色data2_admin,角色data2_admin对data2具有读写权限。因此,用户alice对数据data2进行了读写,可见下面的测试也是成立的。以上就是使用编辑器测试权限的过程,只要我们了解RBAC中的权限关系即可。PyCasbin模块的使用casbin支持多种权限模型,最常用的是RBAC,我们将以该模型为例介绍如何在Python中使用。安装pipinstallcasbin的简单示例1.初始化一个enforcer,传入两个参数:模型文件路径和策略文件路径;模型文件和策略文件都可以从库中下载,访问gitee,搜索pycasbin,在examples目录下下载rbac_model。confimportcasbine=casbin.Enforcer("path/to/model.conf","path/to/policy.csv")2.在你的代码需要访问控制的地方添加如下钩子;sub="alice"#theuserthatwantstoaccessaresource.obj="data1"#theresourcethatisgoingtobeaccessed.act="read"#theoperationthattheuserperformsontheresource.ife.enforce(sub,obj,act):#permitalicetoreaddata1passelse:#denytherequest,showanerrorpasspycasbin本身有很多操作方法,因为它支持多种权限模型,所有的接口都是针对特定的模型设计的,但是接口方法很多,会让用户感到迷惑。因此,我只总结一下我目前使用的RBAC权限模型的接口。如果后面有新的接口需要用到,那么在添加到文档中使用之前,先分析一下常用的权限处理。添加角色权限e.add_policy('super','user','add')删除角色权限e.remove_policy('super','user','add')增加用户权限e.add_permission_for_user('lisi','user','add')删除用户指定权限e.delete_permission_for_user('lisi','user','add')删除所有用户权限e.delete_permissions_for_user('zhangsan')查询用户权限e.get_permissions_for_user('lisi')增加用户角色e.add_role_for_user('zhangsan','admin')删除用户指定角色e.delete_role_for_user('zhangsan','admin')删除所有用户角色e.delete_roles_for_user('zhangsan','admin')查询用户角色e.get_roles_for_user('zhangsan')删除用户e.delete_user('zhangsan')删除角色e.delete_role('admin')删除权限e.delete_permission('add')确定用户权限e.enforce('super','user','add')权限测试以上例为例,权限策略如下:p,data2_admin,data2,readp,data2_admin,data2,writep,data1_admin,data1,readp,data1_admin,data1,writeg,alice,data1_admin,bob,data2_admin根据我们推断用户alice对数据data1有读取权限,使用pycasbin判断权限是否正常:e.enforce('alice','data1','read')#OutputTrue以上是我们目前需要使用的接口,在官方文档中告诉我们不能使用casbin进行用户管理和角色管理。建议项目自己管理用户列表和角色列表,所以我们需要创建单独的用户表和角色表,但是之前是用外键分开的。关联,现在只需要创建表信息,角色和用户的关系会通过casbin进行管理