婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av

主頁 > 知識庫 > go語言使用Casbin實現(xiàn)角色的權限控制

go語言使用Casbin實現(xiàn)角色的權限控制

熱門標簽:電話機器人軟件免費 百度地圖標注后傳給手機 外呼系統(tǒng)用什么卡 評價高的400電話辦理 外呼系統(tǒng)顯本地手機號 阿克蘇地圖標注 excel地圖標注分布數(shù)據(jù) 壽光微信地圖標注 涿州代理外呼系統(tǒng)

本文主要介紹了go語言使用Casbin實現(xiàn)角色的權限控制,分享給大家,具體如下:

介紹 Casbin 是什么?

官方解釋:Casbin是一個強大的、高效的開源訪問控制框架,其權限管理機制支持多種訪問控制模型。

Casbin只負責訪問控制。身份認證 authentication(即驗證用戶的用戶名、密碼),需要其他專門的身份認證組件負責。例如(jwt-go)

兩個核心概念:

訪問控制模型model和策略policy。

工作原理:

Casbin把 訪問控制模型 被抽象為基于

PERM元模型 (Policy, Effect, Request, Matchers) [策略,效果,請求,匹配器], 反映了權限的本質(zhì) – 訪問控制

  • Policy: 定義權限的規(guī)則
  • Effect: 定義組合了多個 Policy 之后的結果, allow/deny
  • Request: 訪問請求, 也就是誰想操作什么
  • Matcher: 判斷 Request 是否滿足 Policy

匹配來源:定義的 request 和 存儲的 police 比對判斷。

所有 model file 中主要就是定義 PERM 4 個部分的一個文件( model.conf , 這個文件一般是固定的)。

因此,切換或升級項目的授權機制與修改配置一樣簡單。 您可以通過組合可用的模型來定制您自己的訪問控制模型(ACL, RBAC, ABAC)。

例如,您可以在一個model中獲得RBAC角色和ABAC屬性,并共享一組policy規(guī)則。

g, g2, g3 表示不同的 RBAC 體系, _, _ 表示用戶和角色 _, _, _ 表示用戶, 角色, 域(也就是租戶)

rbac_models.conf

# Request definition
[request_definition]
r = sub, obj, act

# Policy definition
[policy_definition]
p = sub, obj, act

# Policy effect
[policy_effect]
e = some(where (p.eft == allow))

# Matchers
[matchers]
m = r.sub == p.sub  r.obj == p.obj  r.act == p.act

實戰(zhàn)

一般運用到項目后臺的管理權限中

初始化數(shù)據(jù)庫

初始化環(huán)境后,系統(tǒng)會在你選擇的數(shù)據(jù)庫自動生成一個casbin_rule的數(shù)據(jù)庫表

用戶權限的增刪改查

tips:這些接口,需要放在截器中間件前面, 不然空表無法添加數(shù)據(jù)

//使用自定義攔截器中間件
r.Use(Authorize())
//增加policy
	r.POST("/api/v1/add", func(c *gin.Context) {
		fmt.Println("增加Policy")
		if ok, _ := Enforcer.AddPolicy("admin", "/api/v1/world", "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, _ := Enforcer.RemovePolicy("admin", "/api/v1/world", "GET"); !ok {
			fmt.Println("Policy不存在")
		} else {
			fmt.Println("刪除成功")
		}
	})
	//獲取policy
	r.GET("/api/v1/get", func(c *gin.Context) {
		fmt.Println("查看policy")
		list := Enforcer.GetPolicy()
		for _, vlist := range list {
			for _, v := range vlist {
				fmt.Printf("value: %s, ", v)
			}
		}
	})

添加權限,訪問其添加接口


單個用戶保存權限的路由是多條記錄

在使用Casbin中間件時,會訪問表中的數(shù)據(jù)庫表 ,得到相應的權限信息,增加訪問信息后,訪問接口成功

代碼

package main

import (
	"fmt"
	"github.com/casbin/casbin"
	xormadapter "github.com/casbin/xorm-adapter"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"net/http"
)

var Enforcer *casbin.Enforcer

func init() {
	CasbinSetup()
}

// 初始化casbin
func CasbinSetup(){
	a, err := xormadapter.NewAdapter("mysql", "root:root123@tcp(127.0.0.1:3306)/casbin?charset=utf8", true)
	if err != nil {
		log.Printf("連接數(shù)據(jù)庫錯誤: %v", err)
		return
	}
	e, err := casbin.NewEnforcer("./conf/rbac_models.conf", a)
	if err != nil {
		log.Printf("初始化casbin錯誤: %v", err)
		return
	}

	Enforcer = e
	//return e
}


func Hello(c *gin.Context) {
	fmt.Println("Hello 接收到GET請求..")
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "Success",
		"data": "Hello 接收到GET請求..",
	})
}


func main() {
	//獲取router路由對象
	r := gin.New()


	//增加policy
	r.GET("/api/v1/add", func(c *gin.Context) {
		fmt.Println("增加Policy")
		if ok, _ := Enforcer.AddPolicy("admin", "/api/v1/world", "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, _ := Enforcer.RemovePolicy("admin", "/api/v1/world", "GET"); !ok {
			fmt.Println("Policy不存在")
		} else {
			fmt.Println("刪除成功")
		}
	})
	//獲取policy
	r.GET("/api/v1/get", func(c *gin.Context) {
		fmt.Println("查看policy")
		list := Enforcer.GetPolicy()
		for _, vlist := range list {
			for _, v := range vlist {
				fmt.Printf("value: %s, ", v)
			}
		}
	})

	//使用自定義攔截器中間件
	r.Use(Authorize())




	//創(chuàng)建請求
	r.GET("/api/v1/hello", Hello)
	r.Run(":9000") //參數(shù)為空 默認監(jiān)聽8080端口
}




//攔截器
func Authorize() gin.HandlerFunc {

	return func(c *gin.Context) {
		//var e *casbin.Enforcer
		e := Enforcer

		//從DB加載策略
		e.LoadPolicy()

		//獲取請求的URI
		obj := c.Request.URL.RequestURI()
		//獲取請求方法
		act := c.Request.Method
		//獲取用戶的角色 應該從db中讀取
		sub := "admin"

		//判斷策略中是否存在
		if ok, _ := e.Enforce(sub, obj, act); ok {
			fmt.Println("恭喜您,權限驗證通過")
			c.Next() // 進行下一步操作
		} else {
			fmt.Println("很遺憾,權限驗證沒有通過")
			c.Abort()
		}
	}
}

總代碼

package main

import (
	"fmt"
	"github.com/casbin/casbin"
	xormadapter "github.com/casbin/xorm-adapter"
	"github.com/gin-gonic/gin"
	_ "github.com/go-sql-driver/mysql"
	"log"
	"net/http"
)

var Enforcer *casbin.Enforcer

func init() {
	CasbinSetup()
}

// 初始化casbin
func CasbinSetup(){
	a, err := xormadapter.NewAdapter("mysql", "root:root123@tcp(127.0.0.1:3306)/casbin?charset=utf8", true)
	if err != nil {
		log.Printf("連接數(shù)據(jù)庫錯誤: %v", err)
		return
	}
	e, err := casbin.NewEnforcer("./conf/rbac_models.conf", a)
	if err != nil {
		log.Printf("初始化casbin錯誤: %v", err)
		return
	}

	Enforcer = e
	//return e
}


func Hello(c *gin.Context) {
	fmt.Println("Hello 接收到GET請求..")
	c.JSON(http.StatusOK, gin.H{
		"code": 200,
		"msg":  "Success",
		"data": "Hello 接收到GET請求..",
	})
}


func main() {
	//獲取router路由對象
	r := gin.New()


	//增加policy
	r.GET("/api/v1/add", func(c *gin.Context) {
		fmt.Println("增加Policy")
		if ok, _ := Enforcer.AddPolicy("admin", "/api/v1/world", "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, _ := Enforcer.RemovePolicy("admin", "/api/v1/world", "GET"); !ok {
			fmt.Println("Policy不存在")
		} else {
			fmt.Println("刪除成功")
		}
	})
	//獲取policy
	r.GET("/api/v1/get", func(c *gin.Context) {
		fmt.Println("查看policy")
		list := Enforcer.GetPolicy()
		for _, vlist := range list {
			for _, v := range vlist {
				fmt.Printf("value: %s, ", v)
			}
		}
	})

	//使用自定義攔截器中間件
	r.Use(Authorize())




	//創(chuàng)建請求
	r.GET("/api/v1/hello", Hello)
	r.Run(":9000") //參數(shù)為空 默認監(jiān)聽8080端口
}




//攔截器
func Authorize() gin.HandlerFunc {

	return func(c *gin.Context) {
		//var e *casbin.Enforcer
		e := Enforcer

		//從DB加載策略
		e.LoadPolicy()

		//獲取請求的URI
		obj := c.Request.URL.RequestURI()
		//獲取請求方法
		act := c.Request.Method
		//獲取用戶的角色 應該從db中讀取
		sub := "admin"

		//判斷策略中是否存在
		if ok, _ := e.Enforce(sub, obj, act); ok {
			fmt.Println("恭喜您,權限驗證通過")
			c.Next() // 進行下一步操作
		} else {
			fmt.Println("很遺憾,權限驗證沒有通過")
			c.Abort()
		}
	}
}

封裝后的代碼

package mycasbin

import (
	"simple-api/mongoose"
	"github.com/casbin/mongodb-adapter"
	"github.com/casbin/casbin"
	"gopkg.in/mgo.v2/bson"
)

type CasbinModel struct {
	ID       bson.ObjectId `json:"id" bson:"_id"`
	Ptype    string        `json:"ptype" bson:"ptype"`
	RoleName string        `json:"rolename" bson:"v0"`
	Path     string        `json:"path" bson:"v1"`
	Method   string        `json:"method" bson:"v2"`
}

//添加權限
func (c *CasbinModel) AddCasbin(cm CasbinModel) bool {
	e := Casbin()
	e.AddPolicy(cm.RoleName, cm.Path, cm.Method)
	return true

}

//持久化到數(shù)據(jù)庫
// "github.com/casbin/mongodb-adapter"
// func Casbin() *casbin.Enforcer {
// 	a := mongodbadapter.NewAdapter(mongoose.MongoUrl)
// 	e := casbin.NewEnforcer("conf/auth_model.conf", a)
// 	e.LoadPolicy()
// 	return e
// }
func Casbin() *casbin.Enforcer {
	a := mongodbadapter.NewAdapter(mongoose.MongoUrl)
	e, err := casbin.NewEnforcer("conf/auth_model.conf", a)
	if err != nil {
		panic(err)
	}
	e.LoadPolicy()
	return e
}
package apis

import (
	"net/http"
	"simple-api/utils/mycasbin"

	"github.com/gin-gonic/gin"
	"gopkg.in/mgo.v2/bson"
)

var (
	casbins = mycasbin.CasbinModel{}
)

func AddCasbin(c *gin.Context) {
	rolename := c.PostForm("rolename")
	path := c.PostForm("path")
	method := c.PostForm("method")
	ptype := "p"
	casbin := mycasbin.CasbinModel{
		ID:       bson.NewObjectId(),
		Ptype:    ptype,
		RoleName: rolename,
		Path:     path,
		Method:   method,
	}
	isok := casbins.AddCasbin(casbin)
	if isok {
		c.JSON(http.StatusOK, gin.H{
			"success": true,
			"msg":     "保存成功",
		})
	} else {
		c.JSON(http.StatusOK, gin.H{
			"success": false,
			"msg":     "保存失敗",
		})
	}
}

參考

https://www.jianshu.com/p/9506406e745f

到此這篇關于go語言使用Casbin實現(xiàn)角色的權限控制的文章就介紹到這了,更多相關go語言角色權限控制內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

您可能感興趣的文章:
  • Golang之casbin權限管理的實現(xiàn)

標簽:梅河口 重慶 蘭州 銅川 欽州 雞西 吐魯番 汕頭

巨人網(wǎng)絡通訊聲明:本文標題《go語言使用Casbin實現(xiàn)角色的權限控制》,本文關鍵詞  語言,使用,Casbin,實現(xiàn),角色,;如發(fā)現(xiàn)本文內(nèi)容存在版權問題,煩請?zhí)峁┫嚓P信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡,涉及言論、版權與本站無關。
  • 相關文章
  • 下面列出與本文章《go語言使用Casbin實現(xiàn)角色的權限控制》相關的同類信息!
  • 本頁收集關于go語言使用Casbin實現(xiàn)角色的權限控制的相關信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    91同城在线观看| 91黄视频在线观看| 欧美视频日韩视频| 丝袜国产日韩另类美女| 欧美一区二区三区视频| 日本欧美一区二区三区| 欧美一区二区免费| 国产一区二区主播在线| 欧美韩日一区二区三区四区| 国产91精品免费| 97精品超碰一区二区三区| 精品少妇一区二区三区日产乱码 | 美日韩黄色大片| 精品少妇一区二区三区在线视频| 九一久久久久久| 亚洲三级小视频| 欧美精品免费视频| youjizz国产精品| 久久精品国产99国产| 国产人伦精品一区二区| 欧美在线免费视屏| 韩国精品主播一区二区在线观看 | 亚洲激情五月婷婷| 欧美精品一区二区三区高清aⅴ | 色乱码一区二区三区88| 精品一区二区综合| 一区二区三区精品视频在线| 精品理论电影在线| 欧美裸体一区二区三区| 成人福利在线看| 亚洲超碰精品一区二区| 自拍偷拍亚洲欧美日韩| 久久久久久久久久美女| 日韩一级大片在线| 91精品国产欧美一区二区| 在线观看免费视频综合| 99久久久久久99| 不卡一卡二卡三乱码免费网站| 国产一区视频在线看| 蜜桃视频在线一区| 日本不卡123| 日韩激情一二三区| 青青青爽久久午夜综合久久午夜| 天堂在线亚洲视频| av成人免费在线观看| 奇米亚洲午夜久久精品| 婷婷国产在线综合| 午夜欧美视频在线观看 | 成人一区二区三区视频在线观看| 久久精品噜噜噜成人av农村| 日韩国产一二三区| 日韩电影在线观看网站| 日韩高清不卡一区二区三区| 婷婷综合五月天| 亚洲一区二区在线视频| 亚洲一区二区三区自拍| 日韩**一区毛片| 国产一区二区不卡在线| 国产.欧美.日韩| 91美女在线视频| 欧美一区二区三区男人的天堂| 日韩欧美国产1| 日韩久久免费av| 欧美性淫爽ww久久久久无| 国产乱码字幕精品高清av| 国产精品一区2区| 日韩一区二区三区视频在线| 午夜av区久久| 91精品国产综合久久久蜜臀粉嫩 | 日韩一区二区高清| 色综合久久久久久久久| 欧美不卡一区二区| 日韩精品电影一区亚洲| 国产精品久久久久婷婷二区次| 色呦呦网站一区| 蜜臀99久久精品久久久久久软件| 亚洲欧美视频一区| 国产精品美女久久久久久久久| 4438x亚洲最大成人网| 色妹子一区二区| 国产精品1024久久| 黄色日韩网站视频| 免费人成精品欧美精品| 五月天激情综合网| 奇米精品一区二区三区在线观看一| 亚洲视频综合在线| 亚洲色图制服丝袜| 亚洲一区二区美女| 香蕉av福利精品导航 | 亚洲影院在线观看| 亚洲少妇最新在线视频| 亚洲免费观看高清| 亚洲高清一区二区三区| 日韩精品三区四区| 紧缚奴在线一区二区三区| 精品一区二区在线观看| 国产在线观看免费一区| 99精品桃花视频在线观看| 久久精品国产第一区二区三区| 国产一区二区三区蝌蚪| 成人午夜免费视频| 欧美性视频一区二区三区| 欧美成va人片在线观看| 欧美精品一区二区三区高清aⅴ| 精品国产三级a在线观看| 国产精品免费人成网站| 日韩在线观看一区二区| 成人免费视频网站在线观看| 欧美区一区二区三区| 国产欧美一区二区三区鸳鸯浴| 国产精品福利一区二区三区| 性欧美疯狂xxxxbbbb| 99亚偷拍自图区亚洲| 日韩亚洲欧美高清| 亚洲国产精品人人做人人爽| 国产精品夜夜嗨| 国产精品国产三级国产aⅴ无密码| 91偷拍与自偷拍精品| 99re热视频这里只精品| 久久久影院官网| 五月激情综合网| 欧美午夜精品免费| 亚洲精品va在线观看| 日本丰满少妇一区二区三区| 日韩一区中文字幕| 91丨九色丨蝌蚪富婆spa| 国产精品福利一区| 色菇凉天天综合网| 亚洲国产视频a| 色噜噜狠狠色综合中国| 亚洲男人都懂的| 成人午夜看片网址| 17c精品麻豆一区二区免费| 国产河南妇女毛片精品久久久| 欧美一级久久久| 国产精品一区二区91| 26uuu国产电影一区二区| 国产成人在线影院| 中文字幕一区二区在线播放 | 亚洲在线视频免费观看| 91麻豆产精品久久久久久| 亚洲国产成人91porn| 日韩视频免费观看高清完整版| 麻豆精品在线播放| 国产欧美一区二区三区鸳鸯浴| av电影在线观看完整版一区二区| 亚洲乱码国产乱码精品精小说| 在线免费不卡电影| 国产成人精品一区二区三区四区| 99国产精品久久久| 日韩色在线观看| 中文字幕av免费专区久久| 亚洲欧美乱综合| 热久久国产精品| 成人高清视频在线| 在线播放中文字幕一区| 国产精品美女久久久久久久久| 午夜不卡av免费| 成人精品高清在线| 欧美一区二区日韩一区二区| 国产日韩欧美电影| 日韩成人免费在线| 色综合天天综合网天天看片| 欧美一级免费观看| 久久综合999| 日韩av在线发布| 欧美色爱综合网| av一二三不卡影片| 6080午夜不卡| 一区二区成人在线| 99久久99久久精品免费观看| 久久久综合精品| 久久99热99| 欧美喷水一区二区| 一区二区三区蜜桃| 91丨porny丨国产入口| 国产午夜精品一区二区三区四区| 日韩av在线发布| 欧美精品v国产精品v日韩精品 | 欧美日韩中文精品| 亚洲视频免费观看| 91视频91自| 亚洲男人都懂的| 色视频欧美一区二区三区| 自拍偷自拍亚洲精品播放| 99久久免费精品高清特色大片| 欧美三级三级三级| 男人的j进女人的j一区| 日韩欧美国产一区二区在线播放 | 欧美一级艳片视频免费观看| 一区二区国产视频| 在线电影院国产精品| 视频一区视频二区中文字幕| 欧美老女人在线| 精品在线一区二区三区| 久久久国产精华| 91丨porny丨户外露出| 婷婷国产v国产偷v亚洲高清| 26uuu亚洲婷婷狠狠天堂| 欧美日韩高清在线播放|