【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模型,后面用起來就特別簡單,順便說一下 casbinAPI文檔,目前沒有更新Python版本,當然這些文檔函數命名都是一致的,可以參考Go的函數。

最后整體應用於FastAPI 可以參考我的項目模版 https://github.com/CoderCharm/fastapi-mysql-generator


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM