網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
簡(jiǎn)介
Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型。
casbin 的主要特性包括:
- 支持自定義請(qǐng)求的格式,默認(rèn)的請(qǐng)求格式為{subject, object, action};
- 具有訪問(wèn)控制模型 model 和策略 policy 兩個(gè)核心概念;
- 支持 RBAC 中的多層角色繼承,不止主體可以有角色,資源也可以具有角色;
- 支持超級(jí)用戶,如 root 或 Administrator,超級(jí)用戶可以不受授權(quán)策略的約束訪問(wèn)任意資源;
- 支持多種內(nèi)置的操作符,如 keyMatch,方便對(duì)路徑式的資源進(jìn)行管理,如 /foo/bar 可以映射到 /foo*;
casbin 不做的事情:
- 身份認(rèn)證
authentication(即驗(yàn)證用戶的用戶名、密碼),casbin 只負(fù)責(zé)訪問(wèn)控制。應(yīng)該有其他專門的組件負(fù)責(zé)身份認(rèn)證,然后由 casbin 進(jìn)行訪問(wèn)控制,二者是相互配合的關(guān)系; - 管理用戶列表或角色列表
casbin 認(rèn)為由項(xiàng)目自身來(lái)管理用戶、角色列表更為合適,casbin 假設(shè)所有策略和請(qǐng)求中出現(xiàn)的用戶、角色、資源都是合法有效的。
為什么我要使用 Casbin?
在我做的那么多的項(xiàng)目中,權(quán)限處理經(jīng)常是一個(gè)比較頭疼的問(wèn)題,而且每個(gè)項(xiàng)目有不同的權(quán)限控制方式,我一直在想有沒(méi)有一種通用的權(quán)限控制框架,可以適用各種不同的權(quán)限控制,每個(gè)項(xiàng)目只要做簡(jiǎn)單的修改就能完全適用,直到無(wú)意中看到 casbin 這個(gè)庫(kù)。
目前我只是在初步的嘗試使用,因此這里只做簡(jiǎn)單的使用記錄,把我在項(xiàng)目中使用的記錄下來(lái),供自己后面繼續(xù)研究使用,也算是給想要使用此庫(kù)的 pythoner 一個(gè)例子。
官方文檔地址
官方提供了一個(gè)非常好的編輯器,可以讓我們直接體驗(yàn)和測(cè)試 casbin 的權(quán)限處理。
我們簡(jiǎn)單的以官方提供的例子來(lái)做一個(gè)說(shuō)明,首先 Policy 里面配置的是權(quán)限策略,從權(quán)限策略中可以看出用戶 alice 擁有角色 data2_admin,而角色 data2_admin 對(duì)數(shù)據(jù) data2 有 read/write 權(quán)限,因此用戶 alice 對(duì)數(shù)據(jù) data2 擁有 read/write,可以看到下面的測(cè)試中也是 true。
以上就是我們使用編輯器測(cè)試權(quán)限的過(guò)程,只要搞清楚 RBAC 中權(quán)限關(guān)系就可以了。
PyCasbin 模塊的使用
casbin 支持多種權(quán)限模型,我們最常用的是 RBAC,我們就以這種模式為例,來(lái)介紹一下在 Python 中怎么來(lái)使用。
安裝:
pip install casbin
例子
1.初始化一個(gè) enforcer,傳入兩個(gè)參數(shù):模型文件路徑和策略文件路徑;
模型文件和策略文件都可以到庫(kù)上下載,訪問(wèn) gitee,搜索 pycasbin,在 examples 目錄下載 rbac_model.conf
import casbin
e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")
2.在你的代碼需要進(jìn)行訪問(wèn)控制的位置,加入如下鉤子;
sub = "alice" # the user that wants to access a resource.
obj = "data1" # the resource that is going to be accessed.
act = "read" # the operation that the user performs on the resource.
if e.enforce(sub, obj, act):
# permit alice to read data1
pass
else:
# deny the request, show an error
pass
pycasbin 本身?yè)碛泻芏嗖僮鞣椒?,因?yàn)樗С侄喾N權(quán)限模型,所有有些接口是針對(duì)特定的模型設(shè)計(jì)的,但是眾多的接口方法就會(huì)給用戶帶來(lái)困惑,因此我在這里只總結(jié) RBAC 權(quán)限模型中我目前用到的這些接口,后期如果有新的接口使用,再加到文檔內(nèi)
在使用之前我們先分析一下常用的權(quán)限處理有哪些?
增加角色權(quán)限:
e.add_policy('super',?'user',?'add')
刪除角色權(quán)限:
e.remove_policy('super',?'user',?'add')
增加用戶權(quán)限:
e.add_permission_for_user('lisi',?'user',?'add')
刪除用戶指定權(quán)限:
e.delete_permission_for_user('lisi',?'user',?'add')
刪除用戶所有權(quán)限:
e.delete_permissions_for_user('zhangsan')
查詢用戶權(quán)限:
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')
刪除權(quán)限:
e.delete_permission('add')
判斷用戶權(quán)限
e.enforce('super',?'user',?'add')
權(quán)限測(cè)試
以上面的示例為例,權(quán)限策略如下:
p, data2_admin, data2, read
p, data2_admin, data2, write
p, data1_admin, data1, read
p, data1_admin, data1, write
g, alice, data1_admin
g, bob, data2_admin
根據(jù)我們的推斷用戶 alice 對(duì)數(shù)據(jù) data1 擁有 read 權(quán)限,使用 pycasbin 判斷權(quán)限是否正常:
e.enforce('alice', 'data1', 'read')
# 輸出 True
這就是我們目前需要用的的接口了,在官方文檔中告訴我們 casbin 不能用來(lái)做用戶管理和角色管理,建議由項(xiàng)目自身來(lái)管理用戶列表和角色列表,因此我們需要?jiǎng)?chuàng)建單獨(dú)的用戶表和角色表,只不過(guò)以前是通過(guò)外鍵的方式將他們關(guān)聯(lián)起來(lái),現(xiàn)在只需要?jiǎng)?chuàng)建好表信息就行了,角色與用戶的關(guān)系將通過(guò) casbin 進(jìn)行管理。
原文鏈接:https://juejin.cn/post/7085490095955902501
相關(guān)推薦
- 2022-03-24 基于Docker的可持續(xù)交付問(wèn)題_docker
- 2022-10-11 Android獲取Apk使用信息
- 2022-09-02 Oracle11g調(diào)整SGA方法詳解_oracle
- 2022-04-24 25個(gè)值得收藏的Python文本處理案例_python
- 2022-11-05 Nginx監(jiān)控模塊(vts模塊)詳解_nginx
- 2022-10-22 Python構(gòu)建簡(jiǎn)單線性回歸模型_python
- 2022-09-19 Python正則表達(dá)式以及常用匹配實(shí)例_python
- 2022-03-29 詳解C++?的STL迭代器原理和實(shí)現(xiàn)_C 語(yǔ)言
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支