Go語(yǔ)言中的訪問(wèn)權(quán)限控制
在 go 中進(jìn)行權(quán)限管理時(shí),推薦使用 grouper、casbin 和 sentry 框架。grouper 適合基于角色的訪問(wèn)控制,casbin 提供高級(jí) rbac 功能,而 sentry 提供云托管權(quán)限服務(wù)和豐富的功能集,包括多因素認(rèn)證和活動(dòng)審核。這些框架有助于在電子商務(wù)網(wǎng)站等實(shí)際場(chǎng)景中實(shí)施細(xì)粒度的訪問(wèn)控制,例如為用戶授予對(duì)特定產(chǎn)品類別的訪問(wèn)權(quán)限。
Go框架中的權(quán)限管理
權(quán)限管理對(duì)于保護(hù)敏感數(shù)據(jù)和實(shí)現(xiàn)細(xì)粒度的訪問(wèn)控制至關(guān)重要。在 Go 中,有幾個(gè)框架可以簡(jiǎn)化權(quán)限管理任務(wù):
1. Grouper
Grouper 是一個(gè)基于角色的訪問(wèn)控制(RBAC)框架,它允許您輕松創(chuàng)建角色和分配權(quán)限。
import ( "github.com/grouper/grouper" ) func main() { // 創(chuàng)建一個(gè)角色 role := grouper.NewRole("admin") // 添加權(quán)限 role.Allow("read", "data") role.Allow("write", "data") // 創(chuàng)建一個(gè)用戶 user := grouper.NewUser("john") // 分配角色 user.AddRole(role) // 檢查用戶是否有訪問(wèn)權(quán)限 if user.HasPermission("read", "data") { // 授予訪問(wèn)權(quán)限 } else { // 拒絕訪問(wèn)權(quán)限 } }
2. Casbin
Casbin 是另一個(gè)流行的 RBAC 框架,具有豐富的功能集,包括多繼承和條件權(quán)限。
import ( "github.com/casbin/casbin" ) func main() { // 創(chuàng)建一個(gè)執(zhí)行器 enforcer := casbin.NewEnforcer("model.conf", "policy.csv") // 檢查用戶是否有訪問(wèn)權(quán)限 if enforcer.Enforce("john", "data", "read") { // 授予訪問(wèn)權(quán)限 } else { // 拒絕訪問(wèn)權(quán)限 } }
3. Sentry
Sentry 是一個(gè)云托管權(quán)限服務(wù),提供高級(jí)權(quán)限管理功能,例如多因素身份驗(yàn)證和活動(dòng)審計(jì)。
import ( "github.com/getsentry/sentry-go" ) func main() { // 連接到 Sentry _ = sentry.Init(sentry.ClientOptions{}) // 向 Sentry 事件添加用戶上下文 sentry.CaptureEvent(&sentry.Event{ User: &sentry.User{ ID: "john", Username: "john@example.com", }, }) }
案例:Casbin實(shí)現(xiàn)RBAC和功能權(quán)限
1.安裝
go get github.com/casbin/casbin/v2
2.編寫brace_model.conf
[request_definition] r = sub, obj, act [policy_definition] p = sub, obj, act [role_definition] g = _, _ [policy_effect] e = some(where (p.eft == allow)) [matchers] m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
Model語(yǔ)法
Model CONF 至少應(yīng)包含四個(gè)部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
如果 model 使用 RBAC, 還需要添加[role_definition]部分。
Model CONF 文件可以包含注釋。注釋以 # 開(kāi)頭, # 會(huì)注釋該行剩余部分。
sub, obj, act 表示經(jīng)典三元組: 訪問(wèn)實(shí)體 (Subject),訪問(wèn)資源 (Object) 和訪問(wèn)方法 (Action)。 但是, 你可以自定義你自己的請(qǐng)求表單, 如果不需要指定特定資源,則可以這樣定義 sub、act ,或者如果有兩個(gè)訪問(wèn)實(shí)體, 則為 sub、sub2、obj、act??梢园裺ub當(dāng)作用戶角色, obj為資源對(duì)象(比如api路徑), act當(dāng)作請(qǐng)求行為方法(比如get 和 post等)
3.連接mysql
adapter := xormadapter.NewAdapter("mysql", "root:123456@tcp(127.0.0.1:3306)/demo?charset=utf8mb4", true) enforcer := casbin.NewEnforcer("./rbac_models.conf", adapter) err := enforcer.LoadPolicy() if err != nil { logger.RLog.Error("enforcer load policy err", zap.Error(err)) }
4.添加權(quán)限
if ok := enforcer.AddPolicy(roleName, url, method); !ok { log.Fatal("添加權(quán)限失敗") } else { log.Fatal("添加權(quán)限成功") }
5.刪除權(quán)限
if ok := enforcer.RemovePolicy(roleName, url, method); !ok { log.Fatal("刪除權(quán)限失敗") } else { log.Fatal("刪除權(quán)限成功") }
6.中間件校驗(yàn)權(quán)限
func CheckPermission() echo.MiddlewareFunc { return func(handlerFunc echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { obj := c.Request().URL.RequestURI() act := c.Request().Method sub := "admin" if ok := _casbin.Enforcer.Enforce(sub, obj, act); !ok { return c.JSON(http.StatusOK, _auth.PermissionInterception) } return handlerFunc(c) } } }
7.路由引入中間件
總結(jié)
到此這篇關(guān)于Go語(yǔ)言中的訪問(wèn)權(quán)限控制的文章就介紹到這了,更多相關(guān)Go框架中的權(quán)限管理內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口
這篇文章主要為大家詳細(xì)介紹了Go語(yǔ)言實(shí)現(xiàn)單端口轉(zhuǎn)發(fā)到多個(gè)端口,文中的示例代碼講解詳細(xì),具有一定的參考價(jià)值,對(duì)大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以了解下2024-02-02一文帶你掌握Go語(yǔ)言I/O操作中的io.Reader和io.Writer
在?Go?語(yǔ)言中,io.Reader?和?io.Writer?是兩個(gè)非常重要的接口,它們?cè)谠S多標(biāo)準(zhǔn)庫(kù)中都扮演著關(guān)鍵角色,下面就跟隨小編一起學(xué)習(xí)一下它們的使用吧2025-01-01一文帶你使用Golang實(shí)現(xiàn)SSH客戶端
SSH?全稱為?Secure?Shell,是一種用于安全地遠(yuǎn)程登錄到網(wǎng)絡(luò)上的其他計(jì)算機(jī)的網(wǎng)絡(luò)協(xié)議,本文主要為大家詳細(xì)介紹了如何使用?Golang?實(shí)現(xiàn)?SSH?客戶端,需要的可以參考下2023-11-11Go?Ticker?周期性定時(shí)器用法及實(shí)現(xiàn)原理詳解
這篇文章主要為大家介紹了Go?Ticker?周期性定時(shí)器用法及實(shí)現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-08-08Golang多線程下載器實(shí)現(xiàn)高效快速地下載大文件
Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語(yǔ)言天生支持并發(fā)和多線程,可以輕松實(shí)現(xiàn)多線程下載器的開(kāi)發(fā)。通過(guò)使用Golang的協(xié)程和通道,可以將下載任務(wù)分配到多個(gè)線程中并行處理,提高了下載的效率和速度2023-05-05Golang實(shí)現(xiàn)HTTP編程請(qǐng)求和響應(yīng)
本文主要介紹了Golang實(shí)現(xiàn)HTTP編程請(qǐng)求和響應(yīng),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Golang中ringbuffer的實(shí)現(xiàn)與應(yīng)用場(chǎng)景詳解
ringbuffer因?yàn)樗軓?fù)用緩沖空間,通常用于網(wǎng)絡(luò)通信連接的讀寫,雖然市面上已經(jīng)有了go寫的諸多版本的ringbuffer組件,但還是自己造一個(gè)吧2023-06-06Go項(xiàng)目開(kāi)發(fā)中如何讀取應(yīng)用配置詳解
本文主要介紹了Go項(xiàng)目開(kāi)發(fā)中如何讀取應(yīng)用配置詳解,Go生態(tài)中有很多包可以加載并解析配置,最受歡迎的是Viper包,下面就來(lái)詳細(xì)的介紹一下2024-05-05