權限功能,是后台管理比較常用的一個功能,一般都是基於角色去管理權限,本文介紹的就是基於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