欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Golang利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證詳解

 更新時(shí)間:2023年02月03日 15:00:59   作者:爺來(lái)辣  
Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪(fǎng)問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪(fǎng)問(wèn)控制模型,Casbin只負(fù)責(zé)訪(fǎng)問(wèn)控制。本文將利用casbin實(shí)現(xiàn)權(quán)限驗(yàn)證功能,需要的可以參考一下

導(dǎo)語(yǔ)

學(xué)習(xí)一下golang權(quán)限控制,保留一下demo代碼作為參考

Casbin是什么

Casbin是一個(gè)強(qiáng)大的、高效的開(kāi)源訪(fǎng)問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪(fǎng)問(wèn)控制模型,Casbin只負(fù)責(zé)訪(fǎng)問(wèn)控制。

其功能有:

  • 支持自定義請(qǐng)求的格式,默認(rèn)的請(qǐng)求格式為{subject, object, action}。
  • 具有訪(fǎng)問(wèn)控制模型model和策略policy兩個(gè)核心概念。
  • 支持RBAC中的多層角色繼承,不止主體可以有角色,資源也可以具有角色。
  • 支持內(nèi)置的超級(jí)用戶(hù) 例如:rootadministrator。超級(jí)用戶(hù)可以執(zhí)行任何操作而無(wú)需顯式的權(quán)限聲明。
  • 支持多種內(nèi)置的操作符,如 keyMatch,方便對(duì)路徑式的資源進(jìn)行管理,如 /foo/bar 可以映射到 /foo*

實(shí)現(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ù)庫(kù)policy
	e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依舊放本地 沒(méi)有必要放數(shù)據(jù)庫(kù) 把a(bǔ)變成了適配器存到了數(shù)據(jù)庫(kù)

	// 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" // 想要訪(fǎng)問(wèn)資源的用戶(hù)
	obj := "data1" // 將要被訪(fǎng)問(wèn)的資源
	act := "read"  // 用戶(hù)對(duì)資源實(shí)施的操作
	//added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool類(lèi)型
	//fmt.Println(added)
	//fmt.Println(err)
	//if err != nil {
	//	// 處理錯(cuò)誤
	//	fmt.Printf("%s", err)
	//}
	ok, err := e.Enforce(sub, obj, act)

	if err != nil {
		// 處理錯(cuò)誤
		fmt.Printf("%s", err)
	}

	if ok == true {
		// 允許 alice 讀取 data1
		fmt.Println("通過(guò)")
	} else {
		// 拒絕請(qǐng)求,拋出異常
		fmt.Println("未通過(guò)")
	}

	// 您可以使用 BatchEnforce() 去批量處理一些請(qǐng)求。
	// 這個(gè)方法返回一個(gè)布爾類(lèi)型的切片,切片的下標(biāo)對(duì)應(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ù)庫(kù)policy
	e, _ := casbin.NewEnforcer("./model.conf", a)                                                                                            // model依舊放本地 沒(méi)有必要放數(shù)據(jù)庫(kù) 把a(bǔ)變成了適配器存到了數(shù)據(jù)庫(kù)

	// 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" // 想要訪(fǎng)問(wèn)資源的用戶(hù)
	obj := "data1" // 將要被訪(fǎng)問(wèn)的資源
	act := "read"  // 用戶(hù)對(duì)資源實(shí)施的操作
	added, err := e.AddPolicy("alice", "data1", "read") // added返回是bool類(lèi)型
	fmt.Println(added)

	if err != nil {
		// 處理錯(cuò)誤
		fmt.Printf("%s", err)
	}
	ok, err := e.Enforce(sub, obj, act)

	if err != nil {
		// 處理錯(cuò)誤
		fmt.Printf("%s", err)
	}

	if ok == true {
		// 允許 alice 讀取 data1
		fmt.Println("通過(guò)")
	} else {
		// 拒絕請(qǐng)求,拋出異常
		fmt.Println("未通過(guò)")
	}

	// 您可以使用 BatchEnforce() 去批量處理一些請(qǐng)求。
	// 這個(gè)方法返回一個(gè)布爾類(lèi)型的切片,切片的下標(biāo)對(duì)應(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實(shí)現(xiàn)權(quán)限驗(yàn)證詳解的文章就介紹到這了,更多相關(guān)Golang casbin權(quán)限驗(yàn)證內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Go依賴(lài)注入DI工具wire使用詳解(golang常用庫(kù)包)

    Go依賴(lài)注入DI工具wire使用詳解(golang常用庫(kù)包)

    依賴(lài)注入是指程序運(yùn)行過(guò)程中,如果需要調(diào)用另一個(gè)對(duì)象協(xié)助時(shí),無(wú)須在代碼中創(chuàng)建被調(diào)用者,而是依賴(lài)于外部的注入,本文結(jié)合示例代碼給大家介紹Go依賴(lài)注入DI工具wire使用,感興趣的朋友一起看看吧
    2022-04-04
  • go語(yǔ)言中GOPATH GOROOT的作用和設(shè)置方式

    go語(yǔ)言中GOPATH GOROOT的作用和設(shè)置方式

    這篇文章主要介紹了go語(yǔ)言中GOPATH GOROOT的作用和設(shè)置方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2021-05-05
  • Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享

    Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧分享

    這篇文章主要為大家分享一下Go語(yǔ)言中結(jié)構(gòu)體的高級(jí)技巧,文中的示例代碼講解詳細(xì),具有一定的學(xué)習(xí)價(jià)值,感興趣的小伙伴可以跟隨小編一起了解一下
    2023-08-08
  • golang使用excelize庫(kù)操作excel文件的方法詳解

    golang使用excelize庫(kù)操作excel文件的方法詳解

    Excelize是Go語(yǔ)言編寫(xiě)的用于操作Office Excel文檔基礎(chǔ)庫(kù),基于ECMA-376,ISO/IEC 29500國(guó)際標(biāo)準(zhǔn),下面這篇文章主要給大家介紹了關(guān)于golang使用excelize庫(kù)操作excel文件的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • Go語(yǔ)言實(shí)現(xiàn)二分查找方法示例

    Go語(yǔ)言實(shí)現(xiàn)二分查找方法示例

    這篇文章主要為大家介紹了Go語(yǔ)言實(shí)現(xiàn)二分查找方法示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-12-12
  • go語(yǔ)言處理JSON和XML數(shù)據(jù)示例解析

    go語(yǔ)言處理JSON和XML數(shù)據(jù)示例解析

    這篇文章主要介紹了go語(yǔ)言處理JSON和XML數(shù)據(jù)的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-08-08
  • go-zero自定義中間件的幾種方式

    go-zero自定義中間件的幾種方式

    首先 go-zero 已經(jīng)為我們提供了很多的中間件的實(shí)現(xiàn),但有時(shí)難免有需求需要自定義,這里介紹幾種自定義的方法,文中通過(guò)代碼示例講解的非常詳細(xì),具有一定的參考價(jià)值,需要的朋友可以參考下
    2024-07-07
  • Golang線(xiàn)上內(nèi)存爆掉問(wèn)題排查(pprof)與解決

    Golang線(xiàn)上內(nèi)存爆掉問(wèn)題排查(pprof)與解決

    這篇文章主要介紹了Golang線(xiàn)上內(nèi)存爆掉問(wèn)題排查(pprof)與解決,涉及到數(shù)據(jù)敏感,文中代碼是我模擬線(xiàn)上故障的一個(gè)情況,好在我們程序都有添加pprof監(jiān)控,于是直接通過(guò)go tool pprof分析,需要的朋友可以參考下
    2024-04-04
  • Go語(yǔ)言并發(fā)之context標(biāo)準(zhǔn)庫(kù)的使用詳解

    Go語(yǔ)言并發(fā)之context標(biāo)準(zhǔn)庫(kù)的使用詳解

    Context的出現(xiàn)是為了解決在大型應(yīng)用程序中的并發(fā)環(huán)境下,協(xié)調(diào)和管理多個(gè)goroutine之間的通信、超時(shí)和取消操作的問(wèn)題,本文就來(lái)和大家簡(jiǎn)單聊聊它的具體用法,希望對(duì)大家有所幫助
    2023-06-06
  • Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)

    Golang實(shí)現(xiàn)按行讀取文件的方法小結(jié)

    按行讀取文件相較于一次性載入,有著很多優(yōu)勢(shì),如內(nèi)存效率高、處理速度快、實(shí)時(shí)性高等,本文主要介紹了Golang按行讀取文件的相關(guān)方法,希望對(duì)大家有所幫助
    2024-02-02

最新評(píng)論