Go語言中的訪問權(quán)限控制
在 go 中進行權(quán)限管理時,推薦使用 grouper、casbin 和 sentry 框架。grouper 適合基于角色的訪問控制,casbin 提供高級 rbac 功能,而 sentry 提供云托管權(quán)限服務(wù)和豐富的功能集,包括多因素認證和活動審核。這些框架有助于在電子商務(wù)網(wǎng)站等實際場景中實施細粒度的訪問控制,例如為用戶授予對特定產(chǎn)品類別的訪問權(quán)限。
Go框架中的權(quán)限管理
權(quán)限管理對于保護敏感數(shù)據(jù)和實現(xiàn)細粒度的訪問控制至關(guān)重要。在 Go 中,有幾個框架可以簡化權(quán)限管理任務(wù):
1. Grouper
Grouper 是一個基于角色的訪問控制(RBAC)框架,它允許您輕松創(chuàng)建角色和分配權(quán)限。
import ( "github.com/grouper/grouper" ) func main() { // 創(chuàng)建一個角色 role := grouper.NewRole("admin") // 添加權(quán)限 role.Allow("read", "data") role.Allow("write", "data") // 創(chuàng)建一個用戶 user := grouper.NewUser("john") // 分配角色 user.AddRole(role) // 檢查用戶是否有訪問權(quán)限 if user.HasPermission("read", "data") { // 授予訪問權(quán)限 } else { // 拒絕訪問權(quán)限 } }
2. Casbin
Casbin 是另一個流行的 RBAC 框架,具有豐富的功能集,包括多繼承和條件權(quán)限。
import ( "github.com/casbin/casbin" ) func main() { // 創(chuàng)建一個執(zhí)行器 enforcer := casbin.NewEnforcer("model.conf", "policy.csv") // 檢查用戶是否有訪問權(quán)限 if enforcer.Enforce("john", "data", "read") { // 授予訪問權(quán)限 } else { // 拒絕訪問權(quán)限 } }
3. Sentry
Sentry 是一個云托管權(quán)限服務(wù),提供高級權(quán)限管理功能,例如多因素身份驗證和活動審計。
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實現(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語法
Model CONF 至少應(yīng)包含四個部分: [request_definition], [policy_definition], [policy_effect], [matchers]。
如果 model 使用 RBAC, 還需要添加[role_definition]部分。
Model CONF 文件可以包含注釋。注釋以 # 開頭, # 會注釋該行剩余部分。
sub, obj, act 表示經(jīng)典三元組: 訪問實體 (Subject),訪問資源 (Object) 和訪問方法 (Action)。 但是, 你可以自定義你自己的請求表單, 如果不需要指定特定資源,則可以這樣定義 sub、act ,或者如果有兩個訪問實體, 則為 sub、sub2、obj、act??梢园裺ub當作用戶角色, obj為資源對象(比如api路徑), act當作請求行為方法(比如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.中間件校驗權(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語言中的訪問權(quán)限控制的文章就介紹到這了,更多相關(guān)Go框架中的權(quán)限管理內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Go語言實現(xiàn)單端口轉(zhuǎn)發(fā)到多個端口
這篇文章主要為大家詳細介紹了Go語言實現(xiàn)單端口轉(zhuǎn)發(fā)到多個端口,文中的示例代碼講解詳細,具有一定的參考價值,對大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以了解下2024-02-02一文帶你掌握Go語言I/O操作中的io.Reader和io.Writer
在?Go?語言中,io.Reader?和?io.Writer?是兩個非常重要的接口,它們在許多標準庫中都扮演著關(guān)鍵角色,下面就跟隨小編一起學(xué)習(xí)一下它們的使用吧2025-01-01Go?Ticker?周期性定時器用法及實現(xiàn)原理詳解
這篇文章主要為大家介紹了Go?Ticker?周期性定時器用法及實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-08-08Golang多線程下載器實現(xiàn)高效快速地下載大文件
Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語言天生支持并發(fā)和多線程,可以輕松實現(xiàn)多線程下載器的開發(fā)。通過使用Golang的協(xié)程和通道,可以將下載任務(wù)分配到多個線程中并行處理,提高了下載的效率和速度2023-05-05Golang實現(xiàn)HTTP編程請求和響應(yīng)
本文主要介紹了Golang實現(xiàn)HTTP編程請求和響應(yīng),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-08-08Golang中ringbuffer的實現(xiàn)與應(yīng)用場景詳解
ringbuffer因為它能復(fù)用緩沖空間,通常用于網(wǎng)絡(luò)通信連接的讀寫,雖然市面上已經(jīng)有了go寫的諸多版本的ringbuffer組件,但還是自己造一個吧2023-06-06