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

主頁(yè) > 知識(shí)庫(kù) > go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制

go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制

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

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

介紹 Casbin 是什么?

官方解釋:Casbin是一個(gè)強(qiáng)大的、高效的開源訪問(wèn)控制框架,其權(quán)限管理機(jī)制支持多種訪問(wèn)控制模型。

Casbin只負(fù)責(zé)訪問(wèn)控制。身份認(rèn)證 authentication(即驗(yàn)證用戶的用戶名、密碼),需要其他專門的身份認(rèn)證組件負(fù)責(zé)。例如(jwt-go)

兩個(gè)核心概念:

訪問(wèn)控制模型model和策略policy。

工作原理:

Casbin把 訪問(wèn)控制模型 被抽象為基于

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

  • Policy: 定義權(quán)限的規(guī)則
  • Effect: 定義組合了多個(gè) Policy 之后的結(jié)果, allow/deny
  • Request: 訪問(wèn)請(qǐng)求, 也就是誰(shuí)想操作什么
  • Matcher: 判斷 Request 是否滿足 Policy

匹配來(lái)源:定義的 request 和 存儲(chǔ)的 police 比對(duì)判斷。

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

因此,切換或升級(jí)項(xiàng)目的授權(quán)機(jī)制與修改配置一樣簡(jiǎn)單。 您可以通過(guò)組合可用的模型來(lái)定制您自己的訪問(wèn)控制模型(ACL, RBAC, ABAC)。

例如,您可以在一個(gè)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

實(shí)戰(zhàn)

一般運(yùn)用到項(xiàng)目后臺(tái)的管理權(quán)限中

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

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

用戶權(quán)限的增刪改查

tips:這些接口,需要放在截器中間件前面, 不然空表無(wú)法添加數(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)
			}
		}
	})

添加權(quán)限,訪問(wèn)其添加接口


單個(gè)用戶保存權(quán)限的路由是多條記錄

在使用Casbin中間件時(shí),會(huì)訪問(wèn)表中的數(shù)據(jù)庫(kù)表 ,得到相應(yīng)的權(quán)限信息,增加訪問(wèn)信息后,訪問(wèn)接口成功

代碼

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ù)庫(kù)錯(cuò)誤: %v", err)
		return
	}
	e, err := casbin.NewEnforcer("./conf/rbac_models.conf", a)
	if err != nil {
		log.Printf("初始化casbin錯(cuò)誤: %v", err)
		return
	}

	Enforcer = e
	//return e
}


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


func main() {
	//獲取router路由對(duì)象
	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)建請(qǐng)求
	r.GET("/api/v1/hello", Hello)
	r.Run(":9000") //參數(shù)為空 默認(rèn)監(jiān)聽8080端口
}




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

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

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

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

		//判斷策略中是否存在
		if ok, _ := e.Enforce(sub, obj, act); ok {
			fmt.Println("恭喜您,權(quán)限驗(yàn)證通過(guò)")
			c.Next() // 進(jìn)行下一步操作
		} else {
			fmt.Println("很遺憾,權(quán)限驗(yàn)證沒(méi)有通過(guò)")
			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ù)庫(kù)錯(cuò)誤: %v", err)
		return
	}
	e, err := casbin.NewEnforcer("./conf/rbac_models.conf", a)
	if err != nil {
		log.Printf("初始化casbin錯(cuò)誤: %v", err)
		return
	}

	Enforcer = e
	//return e
}


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


func main() {
	//獲取router路由對(duì)象
	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)建請(qǐng)求
	r.GET("/api/v1/hello", Hello)
	r.Run(":9000") //參數(shù)為空 默認(rèn)監(jiān)聽8080端口
}




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

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

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

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

		//判斷策略中是否存在
		if ok, _ := e.Enforce(sub, obj, act); ok {
			fmt.Println("恭喜您,權(quán)限驗(yàn)證通過(guò)")
			c.Next() // 進(jìn)行下一步操作
		} else {
			fmt.Println("很遺憾,權(quán)限驗(yàn)證沒(méi)有通過(guò)")
			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"`
}

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

}

//持久化到數(shù)據(jù)庫(kù)
// "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

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

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

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

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制》,本文關(guān)鍵詞  語(yǔ)言,使用,Casbin,實(shí)現(xiàn),角色,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制》相關(guān)的同類信息!
  • 本頁(yè)收集關(guān)于go語(yǔ)言使用Casbin實(shí)現(xiàn)角色的權(quán)限控制的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    婷婷综合国产,91蜜桃婷婷狠狠久久综合9色 ,九九九九九精品,国产综合av
    精品1区2区3区| 国产日韩精品视频一区| 欧美不卡123| 日韩一区在线播放| 肉色丝袜一区二区| 国产成人综合网| 884aa四虎影成人精品一区| 精品国内二区三区| 亚洲一区二区三区爽爽爽爽爽| 欧美系列在线观看| 国产日产欧美一区二区视频| 亚洲v中文字幕| 色综合天天综合网国产成人综合天| 欧美一区二区在线看| 亚洲激情自拍偷拍| 国产在线国偷精品产拍免费yy| 欧美色图一区二区三区| 自拍视频在线观看一区二区| 国产乱码精品1区2区3区| 欧美久久久影院| 亚洲一区二区av电影| 成人少妇影院yyyy| 久久亚洲一区二区三区四区| 男女男精品网站| 欧美精品自拍偷拍动漫精品| 亚洲视频你懂的| www.综合网.com| 国产亚洲欧美日韩俺去了| 麻豆91在线看| 精品国产免费一区二区三区四区| 视频在线观看一区| 这里是久久伊人| 蜜臀av一区二区三区| 欧美日高清视频| 五月天激情综合网| 欧美欧美欧美欧美| 亚洲va韩国va欧美va| 欧美乱熟臀69xxxxxx| 三级在线观看一区二区| 欧美一级专区免费大片| 亚洲一区二区三区自拍| 欧美色图第一页| 日韩精品91亚洲二区在线观看| 欧美日韩在线播放三区| 偷拍与自拍一区| 日韩一区二区电影在线| 精品一区二区影视| 国产三级三级三级精品8ⅰ区| 成人永久aaa| 亚洲综合在线五月| 91精品国产综合久久蜜臀| 免费在线观看一区二区三区| www国产精品av| 成人免费视频网站在线观看| 亚洲另类春色校园小说| 91精品国产综合久久婷婷香蕉| 美日韩黄色大片| 国产欧美精品一区| 91久久精品一区二区| 日韩成人av影视| 精品国产乱码久久久久久牛牛| 国产精品1区2区3区在线观看| 亚洲欧洲在线观看av| 欧美日本一区二区| 高清成人在线观看| 亚洲国产精品一区二区久久| 亚洲精品在线三区| 99久久精品国产麻豆演员表| 亚洲国产视频一区二区| 26uuu精品一区二区在线观看| av在线不卡观看免费观看| 日韩av一级电影| 最新日韩在线视频| 91精品国产综合久久精品app | 欧美大片日本大片免费观看| 国产高清精品网站| 亚洲午夜激情网站| 国产亚洲欧美一级| 欧美一区二区三区在线观看视频| 成人久久18免费网站麻豆| 亚洲成人www| 国产精品欧美一区二区三区| 4438x成人网最大色成网站| av不卡在线播放| 国产资源精品在线观看| 无码av中文一区二区三区桃花岛| 久久这里只有精品6| 在线免费一区三区| 国产综合久久久久久久久久久久| 精品美女在线播放| 91论坛在线播放| 另类调教123区| 中文字幕一区三区| 精品国产一区二区亚洲人成毛片| 波多野结衣亚洲一区| 婷婷国产v国产偷v亚洲高清| 日本一区二区综合亚洲| 3d动漫精品啪啪1区2区免费| 成人免费va视频| 亚洲一区二区三区视频在线播放 | 99久久伊人网影院| 日本不卡在线视频| 中文字幕一区二| 日韩视频一区二区| 666欧美在线视频| 91蝌蚪porny| 国产一区二三区| 天堂在线一区二区| 亚洲人成精品久久久久| 久久新电视剧免费观看| 久久这里只有精品6| 欧美日韩在线电影| 99精品视频免费在线观看| 日韩不卡一二三区| 一区二区在线观看av| 中文字幕免费一区| 欧美区在线观看| 欧美高清dvd| 日本电影亚洲天堂一区| 国产99精品国产| 久久国产精品免费| 蜜臀av性久久久久蜜臀aⅴ四虎| 亚洲精品亚洲人成人网在线播放| 欧美日本不卡视频| 欧美一区二区三区日韩视频| 在线观看成人免费视频| 色婷婷激情综合| 97精品视频在线观看自产线路二| 极品少妇一区二区三区精品视频| 午夜欧美在线一二页| 日韩av网站免费在线| 亚洲成av人综合在线观看| 一卡二卡三卡日韩欧美| 亚洲同性同志一二三专区| 国产精品区一区二区三区| 欧美v国产在线一区二区三区| 在线播放欧美女士性生活| 91.com视频| 日韩免费看的电影| 欧美一个色资源| 精品国产一区久久| 精品奇米国产一区二区三区| 国产精品你懂的| 亚洲欧美怡红院| 亚洲图片欧美一区| 三级在线观看一区二区| 日韩高清欧美激情| 洋洋成人永久网站入口| 亚洲成人动漫av| 老司机精品视频线观看86| 国产九色sp调教91| www.成人在线| 91久久国产综合久久| 日韩三区在线观看| 国产精品丝袜91| 亚洲一区二区三区在线看| 免费看欧美女人艹b| 日韩成人免费在线| 国产精品香蕉一区二区三区| 99视频一区二区| 欧美日韩免费一区二区三区 | 狠狠狠色丁香婷婷综合激情| 日本三级亚洲精品| 99国产精品久久久久久久久久| 欧美伊人久久久久久久久影院| 91免费在线播放| 3atv在线一区二区三区| 欧美电影免费观看高清完整版在| 亚洲精品乱码久久久久| 日本aⅴ亚洲精品中文乱码| 国产成人午夜视频| 欧美日韩在线播放| 国产欧美日韩另类一区| 亚洲国产精品人人做人人爽| 精品写真视频在线观看| 91日韩精品一区| 精品国产一二三| 五月综合激情网| 国产aⅴ综合色| 91精品婷婷国产综合久久| 精品福利一区二区三区| 日韩电影免费一区| 色婷婷av一区二区三区之一色屋| 91精品国产综合久久久蜜臀粉嫩 | 久久久久免费观看| 日一区二区三区| 成人免费av在线| 欧美大片日本大片免费观看| 亚洲免费观看高清在线观看| 偷拍一区二区三区| 97精品久久久午夜一区二区三区| 日韩免费福利电影在线观看| 亚洲免费高清视频在线| 国产精品一卡二卡在线观看| 欧美男生操女生| 国产精品嫩草99a| 成人免费黄色大片| 欧美不卡一区二区| 日韩电影在线免费| 欧美色欧美亚洲另类二区|