首頁 > 軟體

Golang利用casbin實現許可權驗證詳解

2023-02-05 14:02:12

導語

學習一下golang許可權控制,保留一下demo程式碼作為參考

Casbin是什麼

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

其功能有:

  • 支援自定義請求的格式,預設的請求格式為{subject, object, action}
  • 具有存取控制模型model和策略policy兩個核心概念。
  • 支援RBAC中的多層角色繼承,不止主體可以有角色,資源也可以具有角色。
  • 支援內建的超級使用者 例如:rootadministrator。超級使用者可以執行任何操作而無需顯式的許可權宣告。
  • 支援多種內建的操作符,如 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許可權驗證內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


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