【FastAPI 学习十三】基于casbin的权限校验
权限功能,是后台管理比较常用的一个功能,一般都是基于角色去管理权限,本文介绍的就是基于casbin
的权限验证。
Casbin是一个强大的、高效的开源访问控制框架,其权限管理机制支持多种访问控制模型。支持例如 ACL, RBAC等模型校验。
参考
声明
此功能我是基于 gin-vue-admin 这个Go后台管理的项目复刻的,casbin
官网显示Python版本的 PyCasbin
可用于生产。
学习理解RBAC模型
学习casbin第一步,是需要理解这个模型,这里不涉及任何编程语言,可以去这里 https://casbin.org/zh-CN/editor 自己编辑练习
当然如果没人指导,第一次看到那个模型,完全是懵的,你可以参考奇淼B站视频 https://www.bilibili.com/video/BV1qz4y167XP 介绍casbin
角色权限管理
基础使用就是 根据 角色ID 请求路径 请求方法, 断定当前请求是否可以访问,当你上面那一步模型搞明白了之后,就可以动手写一个小demo 来练习。
https://github.com/CoderCharm/fastapi-mysql-generator/tree/master/examples/demo_casbin
需要安装 pip install casbin
, 然后新建一下三个文件, 放在同一文件夹下。
模型 model.conf
文件
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[policy_effect]
e = some(where (p.eft == allow))
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
数据策略文件 policy.csv
p, 888, /api/userList, GET
Python测试demo如下(名字随意)
import casbin
e = casbin.Enforcer('./model.conf', "./policy.csv", True)
sub = "888" # the user that wants to access a resource.
obj = "/api/userList" # the resource that is going to be accessed.
act = "GET" # the operation that the user performs on the resource.
# 添加 和 删除策略
# e.add_policy("888", "/api/user", "DELETE")
# e.remove_policy("888", "/api/userInfo", "GET")
if e.enforce(sub, obj, act):
print("通过")
else:
print("拒绝")
可以自己动手运行一下 上面的文件, 上面的 model.conf
匹配策略, 是必须要把policy.csv
策略中的三个值 和 待匹配的三个值完全 == 匹配才会通过,
当然你可以 手动修改model.conf
文件中的 [matchers]
匹配策略,比如修改成角色 id 是比较大小,而不是匹配== 之类的。
总结
整体来说, 如果你理解了那个 casbin
模型,后面用起来就特别简单,顺便说一下 casbin
API文档,目前没有更新Python版本,当然这些文档函数命名都是一致的,可以参考Go的函数。
最后整体应用于FastAPI 可以参考我的项目模版 https://github.com/CoderCharm/fastapi-mysql-generator