Go Gin Gorm Casbin权限管理实现 - 1. Casbin概念介绍以及库使用

1. 核心概念

核心配置中含两部分模型配置以及策略配置,给出两个示范配置,在此基础上对实际请求进行分析。

1.1 Model

模型文件,存储了请求定义(request_definition),策略定义(policy_definition),匹配规则(matchers),以及匹配的综合结果(policy_effect)

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act

1.2 Policy

以下为示策略文件policy.csv含有两条策略,策略除了存储在文件中,还可以保存到数据库,后续中我们用到GORM Adapter,保存到数据库中

p,leo,/api/user,GET
p,leo,/api/user,POST

1.3 实例分析

以用户leo通过GET方法访问后台API:/api/user为例

根据request_definition对应request中三个参数为
matchers根据条件匹配策略,匹配返回true
matchers根据条件匹配策略,不匹配的忽略
matchers根据条件匹配策略,不匹配的忽略
policy_effect计算影响,some(where (p.eft == allow))表示其中一条匹配即通过
用户`leo`通过`GET`方法访问`/api/user`
(leo, /api/user, GET)->(r.sub, r.obj, r.act)
匹配策略1
匹配策略2
匹配策略....
返回最终结果通过或者拒绝

1.3 ACL模型和RBAC模型

Casbin模型比较多,只需理解以下两种模型,基本能满足绝大部分业务需求

1.3.1 ACL模型

简单理解,如上面model.conf中不包含用户角色组,策略中都是针对单个用户,用户的请求和动作直接匹配策略,并计算结果

1.3.2 RBAC模型

简单理解,用户关联到角色组,策略定义中针对组做策略

后续gin casbin鉴权中选用该模型
后续示例中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]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

后续示例中policy.csv

定义了两条策略,admin组能访问的资源以及操作,以及用户leo属于admin

p,admin,/api/user,GET
p,admin,/api/user,POSTg,leo,admin

2. 库使用

2.1 Enforcer 执行器概念

Casbin 库中核心概念为执行器Enforcer
使用casbin.NewEnforcer("./model.conf", "./policy.csv")加载模型策略
调用Enforcer的Enforce(r.sub, r.obj, r.act)方法检查鉴权结果

package mainimport ("fmt""github.com/casbin/casbin/v2"
)func CheckPermission(e *casbin.Enforcer, sub, obj, act string) {ok, err := e.Enforce(sub, obj, act)if err != nil {panic("check enforce error: " + err.Error())}if ok {fmt.Printf("用户: %s 访问资源: %s 使用方法: %s 检查通过\n", sub, obj, act)} else {fmt.Printf("用户: %s 访问资源: %s 使用方法: %s 检查拒绝\n", sub, obj, act)}
}func main() {enforcer, err := casbin.NewEnforcer("./model.conf", "./policy.csv")if err != nil {panic("new enforcer error: " + err.Error())}// 预期输出:// 用户: leo 访问资源: /api/user 使用方法: GET 检查通过CheckPermission(enforcer, "leo", "/api/user", "GET")// 预期输出:// 用户: leo 访问资源: /api/user 使用方法: DELETE 检查拒绝CheckPermission(enforcer, "leo", "/api/user", "DELETE")
}

2.2 adapter 适配器概念

casbin.NewEnforcer(“./model.conf”, “./policy.csv”)中默认从文件加载,是内置的名为File Adapter (内置)实现的
后续中,我们需将权限存储到DB中,使用的适配器为GORM Adapter,使用如下:

package mainimport ("log""github.com/casbin/casbin/v2"gormadapter "github.com/casbin/gorm-adapter/v3""github.com/glebarez/sqlite""gorm.io/gorm"
)func main() {db, err := gorm.Open(sqlite.Open("test.db"), &gorm.Config{})if err != nil {panic("failed to connect database")}a, err := gormadapter.NewAdapterByDB(db)if err != nil {panic("new gorm adapter error: " + err.Error())}e, err := casbin.NewEnforcer("./model.conf", a)if err != nil {panic("new casbin enforcer error: " + err.Error())}e.LoadPolicy()// 添加策略ok, err := e.AddPolicy("admin", "/api/user", "GET")log.Println("add admin /api/user GET: ", ok, err)ok, err = e.AddGroupingPolicy("leo", "admin")log.Println("add leo to admin group: ", ok, err)e.SavePolicy()ok, err = e.Enforce("leo", "/api/user", "GET")log.Println("leo GET /api/user :", ok, err)ok, err = e.Enforce("leo", "/api/user", "DELETE")log.Println("leo DELETE /api/user :", ok, err)
}

测试结果

2.3 Functions(Matchers中的函数)

上述model.conf中有一个问题,访问的url是/api/user/123形式,r.objp.obj不匹配,这时候我们要用到Matchers中的函数,一般选择keyMatch2即可能针对url,能满足日常需求
修改后的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]
m = r.sub == p.sub && keyMatch2(r.obj,p.obj) && r.act == p.act

更多函数参考,https://casbin.org/zh/docs/function

函数url模式
keyMatch一个URL 路径,例如/alice_data/resource1一个URL 路径或*模式下,例如/alice_data/*
keyMatch2一个URL 路径,例如/alice_data/resource1一个URL 路径或:模式下,例如/alice_data/:resource
keyMatch3一个URL 路径,例如/alice_data/resource1一个URL 路径或{}模式下,例如/alice_data/{resource}
keyMatch4一个URL 路径,例如/alice_data/resource1一个URL 路径或{}模式下,例如/alice_data//{id}/book/{id}
keyMatch5a URL path like/alice_data/123/?status=1a URL path, a{}or*pattern like/alice_data/{id}/*
regexMatch任意字符串正则表达式模式

3. 结语

至此,已了解的概念已能满足业务需求,下一章将CasbinGorm结合起来,并实现增删改查功能

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/95730.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

推荐一款在线的JDK17中文文档

spring6.0及springboot3.0最低版本要求都是java17,换上java17是迟早的事,所以虽然我现在做的是java8,但是后面我想从java8直接飞升到java17,先做个准备,找到一个JDK17的中文文档,是在线的,地址&…

【小沐学Python】各种Web服务器汇总(Python、Node.js、PHP、httpd、Nginx)

文章目录 1、Web服务器2、Python2.1 简介2.2 安装2.3 使用2.3.1 http.server(命令)2.3.2 socketserver2.3.3 flask2.3.4 fastapi 3、NodeJS3.1 简介3.2 安装3.3 使用3.3.1 http-server(命令)3.3.2 http3.3.3 express 4、PHP4.1 简…

【MVC】C# MVC基础知识点、原理以及容器和管道

给自己一个目标,然后坚持一段时间,总会有收获和感悟! 国庆假期马上结束,闲暇时间,重温一遍C#关于MVC的技术,控制器、视图、模型,知识点和原理,小伙伴们还记得吗 目录 一、MVC知识点1…

Python柱形图

柱形图 柱形图,又称长条图、柱状统计图、条图、条状图、棒形图,是一种以长方形的长度为变量的统计图表。长条图用来比较两个或以上的价值(不同时间或者不同条件),只有一个变量,通常利用于较小的数据集分析…

用OpenCV(Python)获取图像的SIFT特征

import cv2 as cv import numpy as np import matplotlib.pyplot as plt imgcv.imread("../Lena.png") img_graycv.cvtColor(img,cv.COLOR_BGR2GRAY)#创建一个SIFI对象 siftcv.SIFT_create()#使用SIFT对象在灰度图像img_gray中检测关键点,结果存储在变量k…

迄今为止丨ChatGPT最强指令,一个可以让机器人生成机器人的Prompt,价值百万!

原文: 【ChatGPT调教】ChatGPT最强指令、让机器人为你生成机器人!-CSDN博客 说明:最好看原文 昨天,发现了一条可能是迄今为止,我见过最牛的,商业价值最高的ChatGPT指令。 通过这条指令,可以…

windows系统服务管理命令sc

sc可以用于管理系统服务、计划任务、系统日志等方面,是不可或缺的神器。 基本用法 在命令提示符下输入sc命令,然后按回车键。 上图展示的是sc命令的使用方法,支持哪些参数实现哪些功能 要查看系统所有服务列表,包括它们是否正在…

Ubuntu使用cmake和vscode开发自己的项目,引用自己的头文件和openCV

创建文件夹 mkdir my_proj 继续创建include 和 src文件夹,形成如下的目录结构 用vscode打开项目 创建add.h #ifndef ADD_H #define ADD_Hint add(int numA, int numB);#endif add.cpp #include "add.h"int add(int numA, int numB) {return numA nu…

程序人生 / 散文分享 / 生活感悟——【追光的日子】《爷爷的12本日历》,若你也共情,欢迎在评论区分享你的故事、观点、感悟和思考!

在一切变好之前,我们总要经历一些不开心的日子,这段日子也许很长,也许只是一觉醒来。有时候,选择快乐,更需要勇气。 🎯作者主页: 追光者♂🔥 🌸个人简介: 💖[1] 计算机专业硕士研究生💖 🌿[2] 2023年城市之星领跑者TOP1(哈尔滨)🌿 🌟[3]…

基于SpringBoot的视频网站系统

目录 前言 一、技术栈 二、系统功能介绍 用户信息管理 视频分享管理 视频排名管理 交流论坛管理 留言板管理 三、核心代码 1、登录模块 2、文件上传模块 3、代码封装 前言 使用旧方法对视频信息进行系统化管理已经不再让人们信赖了,把现在的网络信息技术运…

《视觉 SLAM 十四讲》V2 第 5 讲 相机与图像

文章目录 相机 内参 && 外参5.1.2 畸变模型单目相机的成像过程5.1.3 双目相机模型5.1.4 RGB-D 相机模型 实践5.3.1 OpenCV 基础操作 【Code】OpenCV版本查看 5.3.2 图像去畸变 【Code】5.4.1 双目视觉 视差图 点云 【Code】5.4.2 RGB-D 点云 拼合成 地图【Code】 习题题…

Python数据容器——集合的相关操作

作者:Insist-- 个人主页:insist--个人主页 本文专栏:Python专栏 专栏介绍:本专栏为免费专栏,并且会持续更新python基础知识,欢迎各位订阅关注。 目录 一、理解集合 1. 集合是什么? 2. 为什么…

Tensorflow、Pytorch和Ray(张量,计算图)

1.深度学习框架(Tensorflow、Pytorch) 1.1由来 可以追溯到2016年,当年最著名的事件是alphago战胜人类围棋巅峰柯洁,在那之后,学界普遍认为人工智能已经可以在一些领域超过人类,未来也必将可以在更多领域超过…

【Java】抽象类和接口的区别

1. 成员区别 抽象类 变量 常量;有构造方法,有抽象方法,也有非抽象方法接口 常量,抽象方法(JDK8 在接口中定义 非抽象方法) 2. 关系区别 类与类 继承单继承类与接口 实现,单实现和多实现接口…

JMETER自适应高分辨率的显示器

系列文章目录 历史文章 每天15分钟JMeter入门篇(一):Hello JMeter 每天15分钟JMeter入门篇(二):使用JMeter实现并发测试 每天15分钟JMeter入门篇(三):认识JMeter的逻辑控…

python 打包可执行文件-pyinstaller详解

python 打包可执行文件-pyinstaller详解 引言一、参数详解二、优化代码三、体积压缩 引言 pyinstaller是一个将python程序打包成独立可执行文件(exe,app等)的工具,它具有跨平台兼容性,可以在windows,mac和…

Flink--9、双流联结(窗口联结、间隔联结)

星光下的赶路人star的个人主页 我还有改变的可能性,一想起这点,我就心潮澎湃 文章目录 1、基于时间的合流——双流联结(Join)1.1 窗口联结(Window Join)1.2 间隔联结(Interval Join)…

项目设计:YOLOv5目标检测+机构光相机(intel d455和d435i)测距

1.介绍 1.1 Intel D455 Intel D455 是一款基于结构光(Structured Light)技术的深度相机。 与ToF相机不同,结构光相机使用另一种方法来获取物体的深度信息。它通过投射可视光谱中的红外结构光图案,然后从被拍摄物体表面反射回来…

【开发篇】十六、SpringBoot整合JavaMail实现发邮件

文章目录 0、相关协议1、SpringBoot整合JavaMail2、发送简单邮件3、发送复杂邮件 0、相关协议 SMTP(Simple Mail Transfer Protocol):简单邮件传输协议,用于发送电子邮件的传输协议POP3(Post Office Protocol - Versi…

Linux上将进程、线程与CPU核绑定

CPU亲和性(CPU Affinity)是某一进程(或线程)绑定到特定的CPU核(或CPU集合),从而使得该进程(或线程)只能运行在绑定的CPU核(或CPU集合)上。进程(或线程)本质上并不与CPU核绑定。每次进程(或线程)被调度执行时,它都可以由其关联列表中的任何CPU核执行。如果…