1. 程式人生 > 程式設計 >Golang之casbin許可權管理的實現

Golang之casbin許可權管理的實現

1. 許可權管理

Casbin是用於Golang專案的功能強大且高效的開源訪問控制庫。

1.1.1. 特徵

Casbin的作用:

以經典{subject,object,action}形式或您定義的自定義形式實施策略,同時支援允許和拒絕授權。
處理訪問控制模型及其策略的儲存。
管理角色使用者對映和角色角色對映(RBAC中的角色層次結構)。
支援內建的超級使用者,例如root或administrator。超級使用者可以在沒有顯式許可權的情況下執行任何操作。
多個內建運算子支援規則匹配。例如,keyMatch可以將資源鍵對映/foo/bar到模式/foo*。

Casbin不執行的操作:

身份驗證(又名驗證username以及password使用者登入時)

管理使用者或角色列表。我相信專案本身管理這些實體會更方便。使用者通常具有其密碼,而Casbin並非設計為密碼容器。但是,Casbin儲存RBAC方案的使用者角色對映。

1.1.2. 怎麼執行的

在Casbin中,基於PERM元模型(策略,效果,請求,匹配器)將訪問控制模型抽象為CONF檔案。因此,切換或升級專案的授權機制就像修改配置一樣簡單。您可以通過組合可用的模型來定製自己的訪問控制模型。例如,您可以在一個模型中同時獲得RBAC角色和ABAC屬性,並共享一組策略規則。

Casbin中最基本,最簡單的模型是ACL。ACL的CONF模型為:

#請求定義
[request_definition] 
r = sub,obj,act

#策略定義
[policy_definition] 
p = sub,obj,act

#政策效果
[policy_effect] 
e = some(其中( p.eft ==允許))

#匹配器
[匹配器] 
米 = r.sub == p.sub && r.obj == p.obj && r.act == p.act

ACL模型的示例策略如下:

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

1.1.3. 安裝

go get github.com/casbin/casbin

1.1.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() {
  // 要使用自己定義的資料庫rbac_db,最後的true很重要.預設為false,使用預設的資料庫名casbin,不存在則建立
  a,err := xormadapter.NewAdapter("mysql","root:root@tcp(127.0.0.1:3306)/goblog?charset=utf8",true)
  if err != nil {
    log.Printf("連線資料庫錯誤: %v",err)
    return
  }
  e,err := casbin.NewEnforcer("./rbac_models.conf",a)
  if err != nil {
    log.Printf("初始化casbin錯誤: %v",err)
    return
  }
  //從DB載入策略
  e.LoadPolicy()

  //獲取router路由物件
  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已經存在")
    } else {
      fmt.Println("增加成功")
    }
  })
  //刪除policy
  r.DELETE("/api/v1/delete",func(c *gin.Context) {
    fmt.Println("刪除Policy")
    if ok,_ := e.RemovePolicy("admin","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))
  //建立請求
  r.GET("/api/v1/hello",func(c *gin.Context) {
    fmt.Println("Hello 接收到GET請求..")
  })

  r.Run(":9000") //引數為空 預設監聽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("恭喜您,許可權驗證通過")
      c.Next()
    } else {
      fmt.Println("很遺憾,許可權驗證沒有通過")
      c.Abort()
    }
  }
}

rbac_models.conf裡面的內容如下:

[request_definition]
r = sub,act

[policy_definition]
p = sub,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

配置連結資料庫不需要手動建立資料庫,系統自動建立casbin_rule表

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

Golang之casbin許可權管理的實現

執行解決結果顯示為很遺憾,許可權驗證沒有通過

下面我在資料表中新增資料在演示的時候可以直接手動按照圖片的格式直接新增資料表,或者使用postman POST方式請求http://localhost:9000/api/v1/add

Golang之casbin許可權管理的實現

然後繼續請求http://localhost:9000/api/v1/hello

Golang之casbin許可權管理的實現

原文地址:
http://www.topgoer.com/gin框架/其他/許可權管理.html

到此這篇關於Golang之casbin許可權管理的實現的文章就介紹到這了,更多相關Golang casbin許可權管理內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!