Golang利用casbin實現權限驗證詳解
更新時間:2023年02月03日 15:00:59 作者:爺來辣
Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型,Casbin只負責訪問控制。本文將利用casbin實現權限驗證功能,需要的可以參考一下
導語
學習一下golang權限控制,保留一下demo代碼作為參考
Casbin是什么
Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型,Casbin只負責訪問控制。
其功能有:
- 支持自定義請求的格式,默認的請求格式為
{subject, object, action}。 - 具有訪問控制模型model和策略policy兩個核心概念。
- 支持RBAC中的多層角色繼承,不止主體可以有角色,資源也可以具有角色。
- 支持內置的超級用戶 例如:
root或administrator。超級用戶可以執(zhí)行任何操作而無需顯式的權限聲明。 - 支持多種內置的操作符,如
keyMatch,方便對路徑式的資源進行管理,如/foo/bar可以映射到/foo*
實現思路
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) // 數據庫policy
e, _ := casbin.NewEnforcer("./model.conf", a) // model依舊放本地 沒有必要放數據庫 把a變成了適配器存到了數據庫
// 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() 去批量處理一些請求。
// 這個方法返回一個布爾類型的切片,切片的下標對應二位數組的行標
// 例如 results[0] 是 {"alice", "data1", "read"} 的結果
//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) // 數據庫policy
e, _ := casbin.NewEnforcer("./model.conf", a) // model依舊放本地 沒有必要放數據庫 把a變成了適配器存到了數據庫
// 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() 去批量處理一些請求。
// 這個方法返回一個布爾類型的切片,切片的下標對應二位數組的行標
// 例如 results[0] 是 {"alice", "data1", "read"} 的結果
//results, err := e.BatchEnforce([][]interface{}{{"alice", "data1", "read"}, {"bob", "data2", "write"}, {"jack", "data3", "read"}})
}

到此這篇關于Golang利用casbin實現權限驗證詳解的文章就介紹到這了,更多相關Golang casbin權限驗證內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Go語言的Windows下環(huán)境配置以及簡單的程序結構講解
這篇文章主要介紹了Go語言的Windows下環(huán)境配置以及簡單的程序結構講解,從編程語言約定俗成的hellow world開始,需要的朋友可以參考下2015-10-10
GOPROXY:解決go get golang.org/x包失敗問題
這篇文章主要介紹了GOPROXY:解決go get golang.org/x包失敗問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-01-01

