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

Go語言中的訪問權(quán)限控制

 更新時間:2024年08月10日 11:20:50   作者:WBOY  
在?go?中進行權(quán)限管理時,推薦使用?grouper、casbin?和?sentry?框架,grouper?適合基于角色的訪問控制,casbin?提供高級?rbac?功能,而?sentry?提供云托管權(quán)限服務(wù)和豐富的功能集,包括多因素認證和活動審核,這些框架有助于在電子商務(wù)網(wǎng)站等實際場景中實施細粒度的訪問控制

在 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ā)到多個端口

    這篇文章主要為大家詳細介紹了Go語言實現(xiàn)單端口轉(zhuǎn)發(fā)到多個端口,文中的示例代碼講解詳細,具有一定的參考價值,對大家的學(xué)習(xí)或工作有一定的幫助,需要的小伙伴可以了解下
    2024-02-02
  • 一文帶你掌握Go語言I/O操作中的io.Reader和io.Writer

    一文帶你掌握Go語言I/O操作中的io.Reader和io.Writer

    在?Go?語言中,io.Reader?和?io.Writer?是兩個非常重要的接口,它們在許多標準庫中都扮演著關(guān)鍵角色,下面就跟隨小編一起學(xué)習(xí)一下它們的使用吧
    2025-01-01
  • 一文帶你使用Golang實現(xiàn)SSH客戶端

    一文帶你使用Golang實現(xiàn)SSH客戶端

    SSH?全稱為?Secure?Shell,是一種用于安全地遠程登錄到網(wǎng)絡(luò)上的其他計算機的網(wǎng)絡(luò)協(xié)議,本文主要為大家詳細介紹了如何使用?Golang?實現(xiàn)?SSH?客戶端,需要的可以參考下
    2023-11-11
  • Golang常量iota的使用實例

    Golang常量iota的使用實例

    今天小編就為大家分享一篇關(guān)于Golang常量iota的使用實例,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2019-01-01
  • Go?Ticker?周期性定時器用法及實現(xiàn)原理詳解

    Go?Ticker?周期性定時器用法及實現(xiàn)原理詳解

    這篇文章主要為大家介紹了Go?Ticker?周期性定時器用法及實現(xiàn)原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-08-08
  • Golang多線程下載器實現(xiàn)高效快速地下載大文件

    Golang多線程下載器實現(xiàn)高效快速地下載大文件

    Golang多線程下載器是一種高效、快速地下載大文件的方法。Golang語言天生支持并發(fā)和多線程,可以輕松實現(xiàn)多線程下載器的開發(fā)。通過使用Golang的協(xié)程和通道,可以將下載任務(wù)分配到多個線程中并行處理,提高了下載的效率和速度
    2023-05-05
  • Golang實現(xiàn)HTTP編程請求和響應(yīng)

    Golang實現(xiàn)HTTP編程請求和響應(yīng)

    本文主要介紹了Golang實現(xiàn)HTTP編程請求和響應(yīng),文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2022-08-08
  • Golang中ringbuffer的實現(xiàn)與應(yīng)用場景詳解

    Golang中ringbuffer的實現(xiàn)與應(yīng)用場景詳解

    ringbuffer因為它能復(fù)用緩沖空間,通常用于網(wǎng)絡(luò)通信連接的讀寫,雖然市面上已經(jīng)有了go寫的諸多版本的ringbuffer組件,但還是自己造一個吧
    2023-06-06
  • Golang交叉編譯之跨平臺編譯使用詳解

    Golang交叉編譯之跨平臺編譯使用詳解

    這篇文章主要為大家介紹了Golang交叉編譯之跨平臺編譯使用詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Go項目開發(fā)中如何讀取應(yīng)用配置詳解

    Go項目開發(fā)中如何讀取應(yīng)用配置詳解

    本文主要介紹了Go項目開發(fā)中如何讀取應(yīng)用配置詳解,Go生態(tài)中有很多包可以加載并解析配置,最受歡迎的是Viper包,下面就來詳細的介紹一下
    2024-05-05

最新評論