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

Go gin權(quán)限驗(yàn)證實(shí)現(xiàn)過程詳解

 更新時(shí)間:2023年01月08日 10:18:23   作者:夏沫的夢  
這篇文章主要為大家介紹了Go gin權(quán)限驗(yàn)證實(shí)現(xiàn)過程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

權(quán)限管理

Casbin是用于Golang項(xiàng)目的功能強(qiáng)大且高效的開源訪問控制庫。

1. 特征

Casbin的作用:

  • 以經(jīng)典{subject, object, action}形式或您定義的自定義形式實(shí)施策略,同時(shí)支持允許和拒絕授權(quán)。
  • 處理訪問控制模型及其策略的存儲(chǔ)。
  • 管理角色用戶映射和角色角色映射(RBAC中的角色層次結(jié)構(gòu))。
  • 支持內(nèi)置的超級(jí)用戶,例如root或administrator。超級(jí)用戶可以在沒有顯式權(quán)限的情況下執(zhí)行任何操作。
  • 多個(gè)內(nèi)置運(yùn)算符支持規(guī)則匹配。例如,keyMatch可以將資源鍵映射/foo/bar到模式/foo*。 Casbin不執(zhí)行的操作:
  • 身份驗(yàn)證(又名驗(yàn)證username以及password用戶登錄時(shí))
  • 管理用戶或角色列表。我相信項(xiàng)目本身管理這些實(shí)體會(huì)更方便。用戶通常具有其密碼,而Casbin并非設(shè)計(jì)為密碼- 容器。但是,Casbin存儲(chǔ)RBAC方案的用戶角色映射。

2. 怎么運(yùn)行的

在Casbin中,基于PERM元模型(策略,效果,請求,匹配器)將訪問控制模型抽象為CONF文件。因此,切換或升級(jí)項(xiàng)目的授權(quán)機(jī)制就像修改配置一樣簡單。您可以通過組合可用的模型來定制自己的訪問控制模型。例如,您可以在一個(gè)模型中同時(shí)獲得RBAC角色和ABAC屬性,并共享一組策略規(guī)則。

Casbin中最基本,最簡單的模型是ACL。ACL的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

ACL模型的示例策略如下:

p, alice, data1, read
p, bob, data2, write

3. 安裝

go get github.com/casbin/casbin

4. 示例代碼

package main
import (
    "fmt"
    "log"
    "github.com/casbin/casbin"
    xormadapter "github.com/casbin/xorm-adapter"
    "github.com/gin-gonic/gin"
    _ "github.com/go-sql-driver/mysql"
)
func main() {
    // 要使用自己定義的數(shù)據(jù)庫rbac_db,最后的true很重要.默認(rèn)為false,使用缺省的數(shù)據(jù)庫名casbin,不存在則創(chuàng)建
    a, err := xormadapter.NewAdapter("mysql", "root:root@tcp(127.0.0.1:3306)/goblog?charset=utf8", true)
    if err != nil {
        log.Printf("連接數(shù)據(jù)庫錯(cuò)誤: %v", err)
        return
    }
    e, err := casbin.NewEnforcer("./rbac_models.conf", a)
    if err != nil {
        log.Printf("初始化casbin錯(cuò)誤: %v", err)
        return
    }
    //從DB加載策略
    e.LoadPolicy()
    //獲取router路由對(duì)象
    r := gin.New()
    r.POST("/api/v1/add", func(c *gin.Context) {
        fmt.Println("增加Policy")
        if ok, _ := e.AddPolicy("admin", "/api/v1/hello", "GET"); !ok {
            fmt.Println("Policy已經(jīng)存在")
        } else {
            fmt.Println("增加成功")
        }
    })
    //刪除policy
    r.DELETE("/api/v1/delete", func(c *gin.Context) {
        fmt.Println("刪除Policy")
        if ok, _ := e.RemovePolicy("admin", "/api/v1/hello", "GET"); !ok {
            fmt.Println("Policy不存在")
        } else {
            fmt.Println("刪除成功")
        }
    })
    //獲取policy
    r.GET("/api/v1/get", func(c *gin.Context) {
        fmt.Println("查看policy")
        list := e.GetPolicy()
        for _, vlist := range list {
            for _, v := range vlist {
                fmt.Printf("value: %s, ", v)
            }
        }
    })
    //使用自定義攔截器中間件
    r.Use(Authorize(e))
    //創(chuàng)建請求
    r.GET("/api/v1/hello", func(c *gin.Context) {
        fmt.Println("Hello 接收到GET請求..")
    })
    r.Run(":9000") //參數(shù)為空 默認(rèn)監(jiān)聽8080端口
}
//攔截器
func Authorize(e *casbin.Enforcer) gin.HandlerFunc {
    return func(c *gin.Context) {
        //獲取請求的URI
        obj := c.Request.URL.RequestURI()
        //獲取請求方法
        act := c.Request.Method
        //獲取用戶的角色
        sub := "admin"
        //判斷策略中是否存在
        if ok, _ := e.Enforce(sub, obj, act); ok {
            fmt.Println("恭喜您,權(quán)限驗(yàn)證通過")
            c.Next()
        } else {
            fmt.Println("很遺憾,權(quán)限驗(yàn)證沒有通過")
            c.Abort()
        }
    }
}

rbac_models.conf里面的內(nèi)容如下:

[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

配置鏈接數(shù)據(jù)庫不需要手動(dòng)創(chuàng)建數(shù)據(jù)庫,系統(tǒng)自動(dòng)創(chuàng)建casbin_rule表

使用postman請求http://localhost:9000/api/v1/hello

運(yùn)行解決結(jié)果顯示為很遺憾,權(quán)限驗(yàn)證沒有通過

下面我在數(shù)據(jù)表中添加數(shù)據(jù)在演示的時(shí)候可以直接手動(dòng)按照圖片的格式直接添加數(shù)據(jù)表,或者使用postman POST方式請求http://localhost:9000/api/v1/add

然后繼續(xù)請求http://localhost:9000/api/v1/hello

以上就是Go gin權(quán)限驗(yàn)證實(shí)現(xiàn)過程詳解的詳細(xì)內(nèi)容,更多關(guān)于Go gin權(quán)限驗(yàn)證的資料請關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解Go語言中的數(shù)據(jù)庫操作

    詳解Go語言中的數(shù)據(jù)庫操作

    數(shù)據(jù)庫是應(yīng)用開發(fā)中必須要掌握的技巧。這篇文章主要和大家介紹一下Go語言中相關(guān)的數(shù)據(jù)庫操作,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-02-02
  • Go如何在HTTP請求中操作cookie教程詳解

    Go如何在HTTP請求中操作cookie教程詳解

    這篇文章主要為大家介紹了Go如何在HTTP請求中操作cookie教程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2024-01-01
  • golang高性能的http請求 fasthttp詳解

    golang高性能的http請求 fasthttp詳解

    fasthttp 是 Go 的快速 HTTP 實(shí)現(xiàn),當(dāng)前在 1M 并發(fā)的生產(chǎn)環(huán)境使用非常成功,可以從單個(gè)服務(wù)器進(jìn)行 100K qps 的持續(xù)連接,總而言之,fasthttp 比 net/http 快 10 倍,下面通過本文給大家介紹golang fasthttp http請求的相關(guān)知識(shí),一起看看吧
    2021-09-09
  • 修改并編譯golang源碼的操作步驟

    修改并編譯golang源碼的操作步驟

    這篇文章主要介紹了修改并編譯golang源碼的操作步驟,本文給大家介紹的非常詳細(xì),需要的朋友可以參考下
    2021-07-07
  • Go語言中for循環(huán)的經(jīng)典案例分析

    Go語言中for循環(huán)的經(jīng)典案例分析

    for循環(huán)問題,在面試中經(jīng)常都會(huì)被問到,并且在實(shí)際業(yè)務(wù)項(xiàng)目中也經(jīng)常用到for循環(huán),要是沒用好,一不下心就掉坑。本文為大家挑選了幾個(gè)經(jīng)典的案例,一塊來探討下,看看如何避免掉坑,多積累積累采坑經(jīng)驗(yàn)
    2023-02-02
  • Go中的new()和make()函數(shù)區(qū)別及底層原理詳解

    Go中的new()和make()函數(shù)區(qū)別及底層原理詳解

    這篇文章主要為大家介紹了Go中的new()和make()函數(shù)區(qū)別及底層原理詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-09-09
  • golang接收post和get請求參數(shù)處理

    golang接收post和get請求參數(shù)處理

    本文主要介紹了golang接收post和get請求參數(shù)處理,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2023-03-03
  • Golang干貨分享之利用AST實(shí)現(xiàn)AOP功能

    Golang干貨分享之利用AST實(shí)現(xiàn)AOP功能

    本文主要是一個(gè)純干貨分享,主要介紹了Golang如何利用AST實(shí)現(xiàn)AOP功能,文中的示例代碼簡潔易懂,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2023-04-04
  • go-python 庫使用應(yīng)用案例

    go-python 庫使用應(yīng)用案例

    本文深入探討了如何使用Go-Python庫進(jìn)行跨語言編程,以及在實(shí)際應(yīng)用中的各種技巧和應(yīng)用案例,在結(jié)語中,我們將對(duì)Go-Python庫的使用方法與技巧進(jìn)行總結(jié),并展望Go與Python混合編程的未來發(fā)展
    2024-03-03
  • Go語言中websocket的使用demo分享

    Go語言中websocket的使用demo分享

    WebSocket是一種在單個(gè)TCP連接上進(jìn)行全雙工通信的協(xié)議。這篇文章主要和大家分享了一個(gè)Go語言中websocket的使用demo,需要的可以參考一下
    2022-12-12

最新評(píng)論