Casbin 權限管理介紹及在 Go 語言中的使用入門

引言

在現代軟件開發過程中,權限管理是一個至關重要的環節,它關系到系統的安全性和用戶體驗。Casbin 是一個強大的訪問控制庫,支持多種訪問控制模型,如 ACL(訪問控制列表)、RBAC(基于角色的訪問控制)、ABAC(基于屬性的訪問控制)等。Casbin 可以方便地集成到各種應用中,提供靈活的權限定義和管理機制。

本文將重點介紹 Casbin 在 Go 語言中的使用,并結合前面提到的配置信息,幫助大家快速入門。

安裝 Casbin

首先,我們需要在 Go 項目中安裝 Casbin。可以通過 go get 命令來安裝:

go get github.com/casbin/casbin/v2

基本概念

在 Casbin 中,權限管理的核心模型由請求定義策略定義策略效果匹配器四部分組成。下面逐一解釋這些概念。

請求定義(Request Definition)

請求定義描述了訪問請求的結構。最常見的是 r = sub, obj, act,其中:

  • sub:表示請求發起的主體(通常是用戶或服務)。
  • obj:表示請求要訪問的對象(比如文件、API 等)。
  • act:表示主體對對象執行的操作(比如讀取、寫入、刪除等)。

例如,r = sub, obj, act 表示一個請求由發起主體、操作對象和操作類型組成。

策略定義(Policy Definition)

策略定義描述了權限策略的結構。同樣常見的結構是 p = sub, obj, act,其中:

  • sub:表示策略中的主體。
  • obj:表示策略中的對象。
  • act:表示策略中的操作類型。

策略定義與請求定義的結構保持一致,便于匹配。

策略效果(Policy Effect)

策略效果定義了如何合并多個匹配的策略規則來決定最終的訪問結果。常見的策略效果有:

  • e = some(where (p.eft == allow)):只要有一個策略規則允許,則允許訪問。
  • e = !some(where (p.eft == deny)):如果沒有一個策略規則拒絕,則允許訪問。
  • e = all(where (p.eft == allow)):所有的策略規則都允許,才允許訪問。

在以下配置中:

  • e = some(where (p.eft == allow)) 表示只要有一個策略規則允許訪問,就允許訪問。

匹配器(Matchers)

匹配器定義了如何將請求與策略規則進行匹配。常見的匹配器有:

  • r.sub == p.sub && r.obj == p.obj && r.act == p.act:完全匹配。
  • r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act):部分匹配,其中 keyMatch 用于字符串前綴匹配,regexMatch 用于正則表達式匹配。

在以下配置中:

  • r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root" 表示主體與策略主體相匹配,且對象通過前綴匹配,操作通過正則表達式匹配,或者主體是 root 時允許訪問。

配置文件詳解

Casbin 使用配置文件來定義具體的訪問控制模型。一個典型的配置文件如下:

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"
  • 請求定義r = sub, obj, act 表示請求由主體、對象和操作組成。
  • 策略定義p = sub, obj, act 表示策略由主體、對象和操作組成。
  • 策略效果e = some(where (p.eft == allow)) 表示只要有一個策略規則允許訪問,就允許訪問。
  • 匹配器r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root" 表示主體與策略主體相匹配,且對象通過前綴匹配,操作通過正則表達式匹配,或者主體是 root 時允許訪問。

在 Gin 框架中使用 Casbin

下面是一個簡單的例子,介紹如何在 Gin 框架中集成 Casbin 進行權限管理。

1. 安裝依賴

go get github.com/casbin/casbin/v2
go get github.com/gin-gonic/gin

2. 初始化 Casbin

創建一個 casbin_model.conf 文件,內容如下:

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"

創建一個 casbin_policy.csv 文件,內容如下:

p, alice, /api/data, GET
p, bob, /api/data, POST
p, admin, /api/*, (GET)|(POST)|(DELETE)

3. 編寫 Gin 代碼

使用csv文件存儲權限配置。

package mainimport ("github.com/casbin/casbin/v2""github.com/casbin/casbin/v2/model""github.com/gin-gonic/gin""net/http"
)func main() {// 加載模型和策略文件m, _ := model.NewModelFromFile("casbin_model.conf")e, _ := casbin.NewEnforcer(m, "casbin_policy.csv")// 創建 Gin 引擎r := gin.Default()// 權限驗證中間件authMiddleware := func(c *gin.Context) {sub := c.GetHeader("X-User")   // 從請求頭中獲取用戶信息obj := c.Request.URL.Path     // 獲取請求路徑act := c.Request.Method       // 獲取請求方法if !e.Enforce(sub, obj, act) {c.JSON(http.StatusForbidden, gin.H{"error": "forbidden"})c.Abort()}}// 定義路由r.GET("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"data": "Here is your data"})})r.POST("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Data created successfully"})})// 啟動服務r.Run(":8080")
}

4. 使用 GORM 適配器初始化 Casbin

上述示例,創建一個 casbin_policy.csv 文件的方式編輯權限不方便使用。一般會把權限配置在數據庫中方便管理。

GORM 是一個功能強大的 Go 語言 ORM(對象關系映射)庫,可以簡化數據庫操作,使開發者能夠更專注于業務邏輯。GORM Casbin 適配器允許你將 Casbin 的策略存儲在數據庫中,通過 GORM 進行操作,從而實現更復雜的權限管理。
下面介紹 GORM 的基本使用方法及其在 Casbin 中的適配器。

GORM適配器是什么?

GORM適配器是Casbin與GORM(Go語言的ORM庫)之間的橋梁,允許你將Casbin的策略存儲在支持GORM的數據庫中,比如MySQL、PostgreSQL、SQLite等,而不是默認的CSV文件。GORM(Go Object Relational Mapping)是一個用于Go程序的ORM庫,它使得數據庫操作更加簡便和類型安全。

GORM適配器做什么用?

GORM適配器的主要用途是將Casbin的策略存儲在數據庫中,從而提供更持久化、可擴展的權限管理解決方案。使用GORM適配器可以帶來以下好處:

  1. 持久化存儲:策略可以存儲在數據庫中,即使應用重啟,策略依然存在。
  2. 可擴展性:使用數據庫可以存儲大量的策略規則,處理復雜的權限邏輯。
  3. 靈活性:可以通過數據庫查詢、更新策略規則,而不是手動編輯CSV文件。
  4. 事務支持:在更新策略時,可以利用數據庫的事務機制,確保數據的一致性和完整性。

如何在Casbin中使用GORM適配器?

首先,你需要安裝GORM適配器。你可以使用以下命令來安裝:

go get github.com/casbin/gorm-adapter/v2

接下來,你需要修改之前的代碼,以支持GORM適配器。假設你使用的是MySQL數據庫,以下是具體步驟:

1. 安裝GORM和MySQL驅動
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2. 修改初始化Casbin的部分
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""github.com/casbin/casbin/v2""github.com/casbin/gorm-adapter/v2""github.com/gin-gonic/gin""net/http"
)func main() {// 連接數據庫dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}// 初始化GORM適配器a, err := gormadapter.NewAdapter(db) // db is your GORM databaseif err != nil {panic(err)}// 加載模型和策略文件m, _ := model.NewModelFromFile("casbin_model.conf")e, _ := casbin.NewEnforcer(m, a)// 添加策略e.AddPolicy("alice", "/api/data", "GET")e.AddPolicy("bob", "/api/data", "POST")e.AddPolicy("admin", "/api/*", "(GET)|(POST)|(DELETE)")// 自動遷移模式a.CreateTables()// 或者從 CSV 文件加載策略// e.LoadPolicyFile("casbin_policy.csv")// 創建 Gin 引擎r := gin.Default()// 權限驗證中間件authMiddleware := func(c *gin.Context) {sub := c.GetHeader("X-User")   // 從請求頭中獲取用戶信息obj := c.Request.URL.Path     // 獲取請求路徑act := c.Request.Method       // 獲取請求方法if !e.Enforce(sub, obj, act) {c.JSON(http.StatusForbidden, gin.H{"error": "forbidden"})c.Abort()}}// 定義路由r.GET("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"data": "Here is your data"})})r.POST("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Data created successfully"})})// 啟動服務r.Run(":8080")
}

5. 測試接口

  • 使用 curl 或 Postman 等工具發送請求。
  • 通過設置不同的請求頭中的 X-User 值來測試不同的用戶權限。
curl -H "X-User: alice" http://localhost:8080/api/data
curl -H "X-User: bob" -X POST http://localhost:8080/api/data
curl -H "X-User: admin" -X DELETE http://localhost:8080/api/data

6. 處理錯誤

如果請求未通過權限驗證,Casbin 將返回 403 Forbidden 錯誤。

7. 注意事項

  • 配置文件路徑:確保 casbin_model.confcasbin_policy.csv 文件路徑正確。
  • 請求頭:本例中通過請求頭 X-User 來傳遞用戶信息,實際應用中可以根據需要調整。
  • 策略文件格式:策略文件中的策略規則需要符合模型定義的結構。

結論

通過本文的學習,你應該已經掌握了 Casbin 的基本概念和在 Go 框架下的使用方法。Casbin 提供了強大的訪問控制功能,可以幫助你更好地管理應用中的權限。希望這個入門指南能夠對你有所幫助!

參考資料

  • Casbin 官方文檔
  • Casbin GitHub 倉庫
  • GORM 官方文檔
  • GORM Casbin 適配器 GitHub 倉庫

如果你在使用過程中遇到任何問題,歡迎隨時提問。希望你能夠在項目中順利集成 Casbin和GROM,提升應用的安全性和管理效率。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/70342.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/70342.shtml
英文地址,請注明出處:http://en.pswp.cn/web/70342.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

快速入門——第三方組件element-ui

學習自嗶哩嗶哩上的“劉老師教編程”,具體學習的網站為:10.第三方組件element-ui_嗶哩嗶哩_bilibili,以下是看課后做的筆記,僅供參考。 第一節 組件間的傳值 組件可以有內部Data提供數據,也可由父組件通過prop方式傳…

【算法通關村 Day7】遞歸與二叉樹遍歷

遞歸與二叉樹遍歷青銅挑戰 理解遞歸 遞歸算法是指一個方法在其執行過程中調用自身。它通常用于將一個問題分解為更小的子問題,通過重復調用相同的方法來解決這些子問題,直到達到基準情況(終止條件)。 遞歸算法通常包括兩個主要…

樸素貝葉斯法

文章目錄 貝葉斯定理樸素貝葉斯法的學習與分類條件獨立假設樸素貝葉斯的后驗概率最大化準則樸素貝葉斯的基本公式 樸素貝葉斯法的參數估計極大似然估計 貝葉斯定理 前置知識:條件概率、全概率、貝葉斯公式 推薦視頻,看完視頻后搜索博客了解先驗概率、后…

《A++ 敏捷開發》- 20 從 AI 到最佳設計

“我們現在推行AIGC,服務端不需要UI交互設計的用AI自動產出代碼,你建議的結對編程、TDD等是否還適用?” 這兩年AI確實很火,是報紙、雜志的熱門話題。例如,HBR雜志從2024年9月至2025年二月份3期,里面有接近一…

GO系列-IO 文件操作

os io 判斷文件是否存在 func fileExist(filePath string) (bool, error) {_, err : os.Stat(filePath)if err nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath} } 讀取文件內容 func readFileContext(…

rs485協議、電路詳解(保姆級)

起源 RS-485即Recommended Standard 485 協議的簡寫。1983年被電子工業協會(EIA)批準為一種通訊接口標準. 數據在通信雙方之間傳輸,本質是傳輸物理的電平,比方說傳輸5V的電壓 -1V的電壓信號,這些物理信號在傳輸過程中會受到很多干擾&#x…

JavaWeb-Tomcat服務器

文章目錄 Web服務器存在的意義關于Web服務器軟件Tomcat服務器簡介安裝Tomcat服務器Tomcat服務器源文件解析配置Tomcat的環境變量啟動Tomcat服務器一個最簡單的webapp(不涉及Java) Web服務器存在的意義 我們之前介紹過Web服務器進行通信的原理, 但是我們當時忘記了一點, 服務器…

【愚公系列】《Python網絡爬蟲從入門到精通》008-正則表達式基礎

標題詳情作者簡介愚公搬代碼頭銜華為云特約編輯,華為云云享專家,華為開發者專家,華為產品云測專家,CSDN博客專家,CSDN商業化專家,阿里云專家博主,阿里云簽約作者,騰訊云優秀博主,騰訊云內容共創官,掘金優秀博主,亞馬遜技領云博主,51CTO博客專家等。近期榮譽2022年度…

視覺分析之邊緣檢測算法

9.1 Roberts算子 Roberts算子又稱為交叉微分算法,是基于交叉差分的梯度算法,通過局部差分計算檢測邊緣線條。 常用來處理具有陡峭的低噪聲圖像,當圖像邊緣接近于正45度或負45度時,該算法處理效果更理想。 其缺點是對邊緣的定位…

DuodooBMS源碼解讀之 sale_change模塊

銷售變更模塊用戶使用手冊 一、模塊概述 本擴展模塊主要包含兩個主要的 Python 文件:sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py,提供了銷售變更報表查看和銷售變更單下載的功能。以下是詳細的使用說明…

OpenCV形態學操作

1.1. 形態學操作介紹 初識: 形態學操作是一種基于圖像形狀的處理方法,主要用于分析和處理圖像中的幾何結構。其核心是通過結構元素(卷積核)對圖像進行掃描和操作,從而改變圖像的形狀和特征。例如: 腐蝕&…

力扣算法-1

力扣算法 1 兩數之和 給定一個整數數組nums和一個整數目標值target,請你在數組中找出和為目標值target的那兩個整數,返回他們的數組下標。 (1)暴力枚舉 (枚舉數組每一個數x,再尋找數組中是否存在 targe…

pyside6學習專欄(三):自定義QLabel標簽擴展類QLabelEx

標簽是界面設計中最常用的控件,本文演示了如何基于PySide6的QLabex控件類擴展定義QLabelEX類,以實現更少的編碼完成各種圖像、彩色文本、動畫的加載和顯示,豐富界面顯示 本示例演示了QLabel和其擴展類QLabelEx分別顯示文本、圖像、動畫的使用…

從0到1:固件分析

固件分析 0x01 固件提取 1、從廠商官網下載 例如D-link的固件: https://support.dlink.com/resource/products/ 2、代理或鏡像設備更新時的流量 發起中間人攻擊MITM #啟用IP轉發功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables,將目…

使用 Spring Boot 和 Canal 實現 MySQL 數據庫同步

文章目錄 前言一、背景二、Canal 簡介三、主庫數據庫配置1.主庫配置2.創建 Canal 用戶并授予權限 四.配置 Canal Server1.Canal Server 配置文件2.啟動 Canal Server 五.開發 Spring Boot 客戶端1. 引入依賴2. 配置 Canal 客戶端3. 實現數據同步邏輯 六.啟動并測試七.注意事項八…

Linux系統配置阿里云yum源,安裝docker

配置阿里云yum源 需要保證能夠訪問阿里云網站 可以先ping一下看看(阿里云可能禁ping,只要能夠解析為正常的ip地址即可) ping mirrors.aliyun.com腳本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…

后端開發:開啟技術世界的新大門

在互聯網的廣闊天地中,后端開發宛如一座大廈的基石,雖不直接與用戶 “面對面” 交流,卻默默地支撐著整個互聯網產品的穩定運行。它是服務器端編程的核心領域,負責處理數據、執行業務邏輯以及與數據庫和其他后端服務進行交互。在當…

銀河麒麟系統安裝mysql5.7【親測可行】

一、安裝環境 cpu:I5-10代; 主板:華碩; OS:銀河麒麟V10(SP1)未激活 架構:Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本:mysql-5.7.34-linux-glibc2.12-x86_64.ta…

從零開始學習PX4源碼9(部署px4源碼到gitee)

目錄 文章目錄 目錄摘要1.gitee上創建倉庫1.1 gitee上創建倉庫PX4代碼倉庫1.2 gitee上創建子倉庫2.固件在gitee部署過程2.1下載固件到本地2.2切換本地分支2.3修改.gitmodules內容2.4同步子模塊倉庫地址2.5同步子模塊倉庫地址更新(下載)子模塊3.一級子模塊和二級子模塊的映射關…

【回溯算法2】

力扣17.電話號碼的字母組合 鏈接: link 思路 這道題容易想到用嵌套的for循環實現,但是如果輸入的數字變多,嵌套的for循環也會變長,所以暴力破解的方法不合適。 可以定義一個map將數字和字母對應,這樣就可以獲得數字字母的映射了…