婷婷综合国产,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
    欧美一级黄色大片| 久久国产婷婷国产香蕉| 91在线国内视频| 婷婷一区二区三区| 国产精品理伦片| 久久精品日韩一区二区三区| 精品视频在线免费| 91色综合久久久久婷婷| 国产精品自拍在线| 美女在线视频一区| 亚洲不卡av一区二区三区| 亚洲国产成人私人影院tom| 欧美在线影院一区二区| 丁香天五香天堂综合| 久久精品国产亚洲a| 日本美女一区二区| 日韩高清在线一区| 亚洲伊人伊色伊影伊综合网| 综合自拍亚洲综合图不卡区| 国产精品每日更新在线播放网址 | 亚洲 欧美综合在线网络| 中文字幕亚洲一区二区va在线| 久久久久久综合| 国产亚洲成av人在线观看导航| 欧美不卡一区二区| 欧美日韩国产一级二级| 成人污污视频在线观看| 国产乱妇无码大片在线观看| 国产一区二区在线视频| 国产黄色精品视频| 91首页免费视频| 91视频免费观看| 欧美三电影在线| 日韩欧美国产三级| 精品国内二区三区| 久久综合九色综合欧美就去吻 | 亚洲精品国产a久久久久久| 国产精品嫩草久久久久| 久久久一区二区| 国产精品盗摄一区二区三区| 综合在线观看色| 午夜欧美视频在线观看| 看国产成人h片视频| 国产精品一二三在| fc2成人免费人成在线观看播放| 91在线高清观看| 欧美日韩三级一区| 欧美tickling网站挠脚心| 国产精品无遮挡| 亚洲中国最大av网站| 日本亚洲天堂网| 91免费视频网址| 日韩欧美成人午夜| 欧美激情中文不卡| 蜜臀av国产精品久久久久| 国产在线观看免费一区| 欧美亚洲免费在线一区| 日本一区二区综合亚洲| 中文字幕一区二区三区四区| 亚洲国产日韩一区二区| 三级久久三级久久久| 国产精品12区| 欧美一区二区三区在线看| 久久久亚洲午夜电影| 亚洲成人免费视频| av在线一区二区三区| 欧美一区二区三区播放老司机| 国产网站一区二区| 日韩国产精品91| av不卡免费在线观看| 久久久亚洲高清| 亚洲国产成人porn| 久久99久久99精品免视看婷婷| 一本到三区不卡视频| 久久久蜜臀国产一区二区| 日韩高清在线观看| 色婷婷综合激情| 亚洲欧美综合色| 成人美女视频在线看| www久久精品| 极品少妇一区二区| 欧美精品九九99久久| 亚洲乱码中文字幕综合| 成人综合在线网站| 国产亚洲欧美日韩俺去了| 欧美a一区二区| 欧美一区二区视频在线观看2020| 亚洲国产欧美一区二区三区丁香婷| 国产成人精品影视| 欧美极品xxx| 国产一区二区不卡在线| 欧美va日韩va| 国产激情视频一区二区在线观看| 欧美精品一区二区三区高清aⅴ| 日韩二区三区四区| 欧美一区二区日韩| 日韩黄色免费电影| 日韩欧美国产精品| 国产一区二区三区四区五区美女| 欧美亚洲国产怡红院影院| 一区二区三区免费观看| 在线观看网站黄不卡| 亚洲成人av一区二区| 91麻豆精品国产91| 午夜国产精品影院在线观看| 欧美日韩综合在线免费观看| 天天操天天色综合| 日韩一区二区在线观看视频播放| 精品一区二区三区影院在线午夜 | 日韩国产高清影视| 91官网在线观看| 午夜久久久影院| 日韩一区二区精品在线观看| 国产麻豆视频精品| 国产精品国产三级国产aⅴ中文| 99久久婷婷国产综合精品电影| 综合精品久久久| 欧美日韩高清影院| 黑人精品欧美一区二区蜜桃| 精品国产91洋老外米糕| 国产在线麻豆精品观看| 国产精品第四页| 欧美挠脚心视频网站| 韩国中文字幕2020精品| 亚洲女同女同女同女同女同69| 在线播放日韩导航| 大胆亚洲人体视频| 午夜av区久久| 国产欧美一区二区三区网站| 国产成人免费在线观看| 亚洲国产中文字幕在线视频综合 | 国产精品丝袜一区| 欧美羞羞免费网站| 精品一区二区在线视频| 亚洲人妖av一区二区| 日韩精品综合一本久道在线视频| 激情六月婷婷久久| 国产欧美一区二区精品秋霞影院| 在线观看成人免费视频| 国产酒店精品激情| 亚洲第一会所有码转帖| 国产日韩在线不卡| 欧美人妖巨大在线| 成人深夜视频在线观看| 日本视频在线一区| 亚洲男女毛片无遮挡| 欧美videos大乳护士334| 成人avav影音| 激情综合网激情| 免费成人在线网站| 亚洲午夜av在线| 综合激情网...| 久久久99久久精品欧美| 欧美日韩国产乱码电影| 成人av第一页| 国产91精品一区二区麻豆亚洲| 午夜日韩在线观看| 亚洲一区二区三区中文字幕| 成人欧美一区二区三区1314| 国产偷国产偷精品高清尤物| 久久新电视剧免费观看| 国产欧美精品国产国产专区| 日本一区二区免费在线观看视频| 国产精品久久久久久久久动漫| 亚洲欧洲精品一区二区精品久久久 | 欧美日韩一区二区三区视频| 欧美日韩高清影院| 日韩天堂在线观看| 国产亚洲一区二区三区四区 | 久久精工是国产品牌吗| 粉嫩av亚洲一区二区图片| av一区二区三区四区| 欧美性大战久久| 欧美va亚洲va在线观看蝴蝶网| 国产人久久人人人人爽| 亚洲免费三区一区二区| 亚洲aaa精品| 国产精品一区在线观看乱码| 99精品视频中文字幕| 欧美日韩精品二区第二页| 日韩手机在线导航| 亚洲欧洲三级电影| 天天操天天干天天综合网| 国产精品一色哟哟哟| 国产麻豆一精品一av一免费 | 亚洲天堂成人网| 91国偷自产一区二区使用方法| 欧美性生活一区| 欧美成人国产一区二区| 精品国产免费人成电影在线观看四季 | 国产伦精品一区二区三区视频青涩| www.综合网.com| 欧美日韩精品一区二区在线播放| 久久色中文字幕| 亚洲国产成人91porn| 从欧美一区二区三区| 3d动漫精品啪啪1区2区免费| 中文字幕在线视频一区| 久久国产精品无码网站| 欧美性一区二区|