首頁 > 軟體

Python 許可權控制模組 Casbin

2022-06-10 14:01:12

簡介

Casbin是一個強大的、高效的開源存取控制框架,其許可權管理機制支援多種存取控制模型。

casbin 的主要特性包括:

  • 支援自定義請求的格式,預設的請求格式為{subject, object, action};
  • 具有存取控制模型 model 和策略 policy 兩個核心概念;
  • 支援 RBAC 中的多層角色繼承,不止主體可以有角色,資源也可以具有角色;
  • 支援超級使用者,如 root 或 Administrator,超級使用者可以不受授權策略的約束存取任意資源;
  • 支援多種內建的操作符,如 keyMatch,方便對路徑式的資源進行管理,如 /foo/bar 可以對映到 /foo*;

casbin 不做的事情:

  • 身份認證
    authentication(即驗證使用者的使用者名稱、密碼),casbin 只負責存取控制。應該有其他專門的元件負責身份認證,然後由 casbin 進行存取控制,二者是相互配合的關係;
  • 管理使用者列表或角色列表
    casbin 認為由專案自身來管理使用者、角色列表更為合適,casbin 假設所有策略和請求中出現的使用者、角色、資源都是合法有效的。

為什麼我要使用 Casbin?

在我做的那麼多的專案中,許可權處理經常是一個比較頭疼的問題,而且每個專案有不同的許可權控制方式,我一直在想有沒有一種通用的許可權控制框架,可以適用各種不同的許可權控制,每個專案只要做簡單的修改就能完全適用,直到無意中看到 casbin 這個庫。

目前我只是在初步的嘗試使用,因此這裡只做簡單的使用記錄,把我在專案中使用的記錄下來,供自己後面繼續研究使用,也算是給想要使用此庫的 pythoner 一個例子。

官方檔案地址

官方提供了一個非常好的編輯器,可以讓我們直接體驗和測試 casbin 的許可權處理。

我們簡單的以官方提供的例子來做一個說明,首先 Policy 裡面設定的是許可權策略,從許可權策略中可以看出使用者 alice 擁有角色 data2_admin,而角色 data2_admin 對資料 data2 有 read/write 許可權,因此使用者 alice 對資料 data2 擁有 read/write,可以看到下面的測試中也是 true。

以上就是我們使用編輯器測試許可權的過程,只要搞清楚 RBAC 中許可權關係就可以了。

PyCasbin 模組的使用

casbin 支援多種許可權模型,我們最常用的是 RBAC,我們就以這種模式為例,來介紹一下在 Python 中怎麼來使用。

安裝:

pip install casbin

例子

1.初始化一個 enforcer,傳入兩個引數:模型檔案路徑和策略檔案路徑;
模型檔案和策略檔案都可以到庫上下載,存取 gitee,搜尋 pycasbin,在 examples 目錄下載 rbac_model.conf

import casbin
e = casbin.Enforcer("path/to/model.conf", "path/to/policy.csv")

2.在你的程式碼需要進行存取控制的位置,加入如下勾點;

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 本身擁有很多操作方法,因為它支援多種許可權模型,所有有些介面是針對特定的模型設計的,但是眾多的介面方法就會給使用者帶來困惑,因此我在這裡只總結 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, read
p, data2_admin, data2, write
p, data1_admin, data1, read
p, data1_admin, data1, write
g, alice, data1_admin
g, bob, data2_admin

根據我們的推斷使用者 alice 對資料 data1 擁有 read 許可權,使用 pycasbin 判斷許可權是否正常:

e.enforce('alice', 'data1', 'read')
# 輸出 True

這就是我們目前需要用的的介面了,在官方檔案中告訴我們 casbin 不能用來做使用者管理和角色管理,建議由專案自身來管理使用者列表和角色列表,因此我們需要建立單獨的使用者表和角色表,只不過以前是通過外來鍵的方式將他們關聯起來,現在只需要建立好表資訊就行了,角色與使用者的關係將通過 casbin 進行管理。

到此這篇關於Python 許可權控制模組 Casbin的文章就介紹到這了,更多相關Python Casbin內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com