Golang利用casbin實現(xiàn)權(quán)限驗證詳解
導(dǎo)語
學(xué)習(xí)一下golang權(quán)限控制,保留一下demo代碼作為參考
Casbin是什么
Casbin是一個強(qiáng)大的、高效的開源訪問控制框架,其權(quán)限管理機(jī)制支持多種訪問控制模型,Casbin只負(fù)責(zé)訪問控制。
其功能有:
- 支持自定義請求的格式,默認(rèn)的請求格式為
{subject, object, action}
。 - 具有訪問控制模型model和策略policy兩個核心概念。
- 支持RBAC中的多層角色繼承,不止主體可以有角色,資源也可以具有角色。
- 支持內(nèi)置的超級用戶 例如:
root
或administrator
。超級用戶可以執(zhí)行任何操作而無需顯式的權(quán)限聲明。 - 支持多種內(nèi)置的操作符,如
keyMatch
,方便對路徑式的資源進(jìn)行管理,如/foo/bar
可以映射到/foo*
實現(xiàn)思路
package main import ( "fmt" "github.com/casbin/casbin/v2" gormadapter "github.com/casbin/gorm-adapter/v3" _ "github.com/go-sql-driver/mysql" ) func main() { //e, err := casbin.NewEnforcer("model.conf", "policy.csv") // 本地policy a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 數(shù)據(jù)庫policy e, _ := casbin.NewEnforcer("./model.conf", a) // model依舊放本地 沒有必要放數(shù)據(jù)庫 把a(bǔ)變成了適配器存到了數(shù)據(jù)庫 // Load the policy from DB. e.LoadPolicy() // Check the permission. e.Enforce("alice", "data1", "read") // Modify the policy. // e.AddPolicy(...) // e.RemovePolicy(...) // Save the policy back to DB. e.SavePolicy() sub := "alice" // 想要訪問資源的用戶 obj := "data1" // 將要被訪問的資源 act := "read" // 用戶對資源實施的操作 //added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool類型 //fmt.Println(added) //fmt.Println(err) //if err != nil { // // 處理錯誤 // fmt.Printf("%s", err) //} ok, err := e.Enforce(sub, obj, act) if err != nil { // 處理錯誤 fmt.Printf("%s", err) } if ok == true { // 允許 alice 讀取 data1 fmt.Println("通過") } else { // 拒絕請求,拋出異常 fmt.Println("未通過") } // 您可以使用 BatchEnforce() 去批量處理一些請求。 // 這個方法返回一個布爾類型的切片,切片的下標(biāo)對應(yīng)二位數(shù)組的行標(biāo) // 例如 results[0] 是 {"alice", "data1", "read"} 的結(jié)果 //results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}}) }
package main import ( "fmt" "github.com/casbin/casbin/v2" gormadapter "github.com/casbin/gorm-adapter/v3" _ "github.com/go-sql-driver/mysql" ) func main() { //e, err := casbin.NewEnforcer("model.conf", "policy.csv") // 本地policy a, _ := gormadapter.NewAdapter("mysql", "root:pass@tcp(localhost:3306)/casbin?charset=utf8mb4&parseTime=True&loc=Local", true) // 數(shù)據(jù)庫policy e, _ := casbin.NewEnforcer("./model.conf", a) // model依舊放本地 沒有必要放數(shù)據(jù)庫 把a(bǔ)變成了適配器存到了數(shù)據(jù)庫 // Load the policy from DB. e.LoadPolicy() // Check the permission. e.Enforce("alice", "data1", "read") // Modify the policy. // e.AddPolicy(...) // e.RemovePolicy(...) // Save the policy back to DB. e.SavePolicy() sub := "alice" // 想要訪問資源的用戶 obj := "data1" // 將要被訪問的資源 act := "read" // 用戶對資源實施的操作 added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool類型 fmt.Println(added) if err != nil { // 處理錯誤 fmt.Printf("%s", err) } ok, err := e.Enforce(sub, obj, act) if err != nil { // 處理錯誤 fmt.Printf("%s", err) } if ok == true { // 允許 alice 讀取 data1 fmt.Println("通過") } else { // 拒絕請求,拋出異常 fmt.Println("未通過") } // 您可以使用 BatchEnforce() 去批量處理一些請求。 // 這個方法返回一個布爾類型的切片,切片的下標(biāo)對應(yīng)二位數(shù)組的行標(biāo) // 例如 results[0] 是 {"alice", "data1", "read"} 的結(jié)果 //results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}}) }
到此這篇關(guān)于Golang利用casbin實現(xiàn)權(quán)限驗證詳解的文章就介紹到這了,更多相關(guān)Golang casbin權(quán)限驗證內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go依賴注入DI工具wire使用詳解(golang常用庫包)
依賴注入是指程序運行過程中,如果需要調(diào)用另一個對象協(xié)助時,無須在代碼中創(chuàng)建被調(diào)用者,而是依賴于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴注入DI工具wire使用,感興趣的朋友一起看看吧2022-04-04go語言中GOPATH GOROOT的作用和設(shè)置方式
這篇文章主要介紹了go語言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2021-05-05golang使用excelize庫操作excel文件的方法詳解
Excelize是Go語言編寫的用于操作Office Excel文檔基礎(chǔ)庫,基于ECMA-376,ISO/IEC 29500國際標(biāo)準(zhǔn),下面這篇文章主要給大家介紹了關(guān)于golang使用excelize庫操作excel文件的相關(guān)資料,需要的朋友可以參考下2022-11-11Golang線上內(nèi)存爆掉問題排查(pprof)與解決
這篇文章主要介紹了Golang線上內(nèi)存爆掉問題排查(pprof)與解決,涉及到數(shù)據(jù)敏感,文中代碼是我模擬線上故障的一個情況,好在我們程序都有添加pprof監(jiān)控,于是直接通過go tool pprof分析,需要的朋友可以參考下2024-04-04Go語言并發(fā)之context標(biāo)準(zhǔn)庫的使用詳解
Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個goroutine之間的通信、超時和取消操作的問題,本文就來和大家簡單聊聊它的具體用法,希望對大家有所幫助2023-06-06Golang實現(xiàn)按行讀取文件的方法小結(jié)
按行讀取文件相較于一次性載入,有著很多優(yōu)勢,如內(nèi)存效率高、處理速度快、實時性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對大家有所幫助2024-02-02