首页 > 其他分享 >casbin + gin + gorm

casbin + gin + gorm

时间:2023-06-20 17:44:24浏览次数:43  
标签:err casbin rule act gin gorm zap

实际项目中肯定要用rbac这种权限模型,因此model使用如下

rbac_model.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]
# 当访问实体为root时直接认证通过,项目肯定需要特殊权限用户
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act || r.sub == "root"

由于casbin、gorm都有不同版本,因此引用的包一定要对上!!!

casbin.go
import (
	"github.com/casbin/casbin/v2"
	gormadapter "github.com/casbin/gorm-adapter/v3"
	"github.com/gin-gonic/gin"
	"go.uber.org/zap"
)

const (
	// 刚才的rbac配置文件路径
	configName = "./configs/rbac_model.conf"
)

var (
	enforcer *casbin.Enforcer

	errErrorPermission = errors.New("权限有误")
)

func InitCasbin() {
	// 这里填入自己的"gorm.io/gorm"的db链接,而不是jinzhu/gorm的,会对不上
	adapter, err := gormadapter.NewAdapterByDB(*gorm.DB)
	if err != nil {
		panic(err)
	}
	enforcer, err = casbin.NewEnforcer(configName, adapter)
	if err != nil {
		panic(err)
	}
	enforcer.EnableLog(false)
	err = enforcer.LoadPolicy()
	if err != nil {
		panic(err)
	}
}

casbin启动默认会在数据库下新建一张casbin_rule表,如果创建有问题,可能是默认引擎是MyISAM,而需要用InnoDB,可以显示的AutoMigrate

db.Set("gorm:table_options", "ENGINE=InnoDB;CHARSET=utf8mb4").AutoMigrate(&gormadapter.CasbinRule{})

在casbin_rule表中可以定义某些用户加入组,然后以“组”概念去匹配权限,但是这样你的user_message表跟user_role表等于直接用casbin_rule里的定义了,或者需要做关联关系,后面新增用户加权限等等是在操作casbin_rule表的。实际情况下不合理,因此还是自己定义好user_message表跟user_role表,并维护好这两个表多对多关系即可,而casbin的实体验证直接验证“权限”这个概念即可,因此casbin_rule表仅需要保留Policie信息即可

casbin_rule表
# 注意get要小写!
INSERT INTO `casbin_rule` (`ptype`,`v0`,`v1`,`v2`) VALUES ('p','dev','/api/dev/*','get');
casbin.go
func CasbinMiddleWare() func(c *gin.Context) {
	return func(c *gin.Context) {
		// 白名单下url不验证
		for _, whiteUrl := range whiteList {
			if strings.Contains(c.Request.URL.String(), whiteUrl) {
				c.Next()
				return
			}
		}

		username := c.GetString("username")
		// 换成自己的角色权限字段
		iuserRoles, exists := c.Get("userRoles")
		zap.L().Debug("c.Get", zap.String("username", username), zap.Any("iuserRoles", iuserRoles))
		if username == "" || !exists {
			handlerbase.BuildErrorNilResponse(c, errErrorAuth)
			c.Abort()
			return
		}

		p := c.Request.URL.Path
		m := c.Request.Method
		zap.L().Debug("Request", zap.String("p", p), zap.String("m", m))
		userRoles := iuserRoles.([]model.UserRole)
		for _, userRole := range userRoles {
			// 如果不使用strings.ToLower则casbin_rule表中act需要为大写!
			// act实体验证该权限名称!
			hit, err := enforcer.Enforce(userRole.RoleName, p, strings.ToLower(m))
			if err != nil || !hit {
				continue
			} else {
				c.Next()
				return
			}
		}

		handlerbase.BuildErrorNilResponse(c, errErrorPermission)
		c.Abort()
	}
}

标签:err,casbin,rule,act,gin,gorm,zap
From: https://www.cnblogs.com/bfmq/p/17494295.html

相关文章

  • 【python】logging日志打印重复输出冗余日志
    https://blog.csdn.net/Moonlight_16/article/details/123334339?spm=1001.2101.3001.6650.4&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7ECTRLIST%7ERate-4-123334339-blog-96309743.235%5Ev38%5Epc_relevant_anti_t3_base&depth_1-utm_source=......
  • Origin 2022 下载与图文安装教程(附安装包)
    解压和安装前先关闭杀毒软件(WIN8/10系统还需要关闭自带杀毒软件Windowsdefender),防止误杀激活补丁,导致破解失败本软件适用于Win7以上系统下载安装包地址https://pan.baidu.com/s/1jmK7-X-GrIzHfP3_o2-mPg?pwd=50181.把Origin资源从网盘下载到电脑上面,右键压缩包选择解压到当......
  • Beginning QA --- Basics and Related Concepts
    基本概念什么是QA?质量保证是以过程为中心的保证一个组织能够提供高质量产品的方法。什么是测试?为什么需要测试?测试是发现和标记缺陷的过程。所谓的缺陷是指实际结果和期望结果之间的任何差别。有的地方,测试也被认为是执行以找出错误为目的的程序的过程。测试是为了让产品达到以下......
  • AtCoder Beginner Contest(abc) 304
    A-FirstPlayer题目大意顺时针给定一个序列,序列的元素由一个字符串和一个数字组成;我们需要从有最小数字的元素开始,顺时针遍历整个序列,并输出字符串;解题思路签到题不多嗦了;神秘代码#include<bits/stdc++.h>#defineintlonglongusingnamespacestd;ty......
  • nginx:报错upstream sent too big header(nginx 1.24)
    一,报错信息:访问网站时报错:如图: 查看nginx的错误日志:2023/06/1610:21:46[error]416087#0:*71148upstreamsenttoobigheaderwhilereadingresponseheaderfromupstream,client:223.72.69.14,server:blog.liuhongdi.com,request:"GET/index......
  • 【问题解决】 网关代理Nginx 301暴露自身端口号
    一般项目上常用Nginx做负载均衡和静态资源服务器,本案例中项目上使用Nginx作为静态资源服务器出现了很奇怪的现象,我们一起来看看。“诡异”的现象部署架构如下图,Nginx作为静态资源服务器监听8080端口,客户浏览器通过API网关的443端口(就是https)获取Nginx静态资源。现象是用户浏览......
  • Python logging 通用模板
    #logger.pyimportloggingimportsocketimportthreadingimportuuidfromlogging.configimportdictConfiglocal=threading.local()#定义一个类,用于实现自定义的过滤器功能classRequestFilter(logging.Filter):deffilter(self,record):get_req......
  • nginx+keepalived
    nginx:1.正向代理:访问转到代理服务,然后去访问正式的地址。2.反向代理:通过一个入口,进行请求转发。3.负载均衡:不同的解析服务器(比如tomcat)进行负载均衡。4.动静分离:将静态的与需要服务器解析分开,以提高访问速度。keepalived:健康检测。为负载均衡而生。如果服务器出现故障......
  • 将 Vue 项目部署到 Nginx 上
    将Vue项目部署到Nginx上安装Nginx下载地址:nginx:download(1)因为我在Windows系统下安装Nginx,所以选择nginx/Windows-1.22.1。下载的资源是一个压缩包,解压后即可使用。(2)打开命令行提示符(cmd),切换到Nginx的根目录,启动Nginx服务器。cd/DD:/software/nginx-1.22.1......
  • BUUCTF:[SUCTF 2019]Pythonginx
    @app.route('/getUrl',methods=['GET','POST'])defgetUrl():url=request.args.get("url")host=parse.urlparse(url).hostnameifhost=='suctf.cc':return"我扌yourproblem?111&q......