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
为例
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.obj
与p.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} |
keyMatch5 | a URL path like/alice_data/123/?status=1 | a URL path, a{} or* pattern like/alice_data/{id}/* |
regexMatch | 任意字符串 | 正则表达式模式 |
3. 结语
至此,已了解的概念已能满足业务需求,下一章将
Casbin
与Gorm
结合起来,并实现增删改查
功能
相关文章:

Go Gin Gorm Casbin权限管理实现 - 1. Casbin概念介绍以及库使用
1. 核心概念 核心配置中含两部分模型配置以及策略配置,给出两个示范配置,在此基础上对实际请求进行分析。 1.1 Model 模型文件,存储了请求定义(request_definition),策略定义(policy_definition),匹配规则(matchers)&a…...

JUC第十五讲:JUC集合-ConcurrentHashMap详解(面试的重点)
JUC第十五讲:JUC集合-ConcurrentHashMap详解 本文是JUC第十五讲:JUC集合-ConcurrentHashMap详解。JDK1.7之前的ConcurrentHashMap使用分段锁机制实现,JDK1.8则使用数组链表红黑树数据结构和CAS原子操作实现ConcurrentHashMap;本文…...

【TensorFlow Hub】:有 100 个预训练模型等你用
要访问TensorFlow Hub,请单击此处 — https://www.tensorflow.org/hub 一、说明 TensorFlow Hub是一个库,用于在TensorFlow中发布,发现和使用可重用模型。它提供了一种使用预训练模型执行各种任务(如图像分类、文本分析等…...

vulnhub靶机doubletrouble
下载地址:doubletrouble: 1 ~ VulnHub 主机发现 arp-scan -l 端口扫描 nmap --min-rate 1000 -p- 192.168.21.151 端口服务扫描 nmap -sV -sT -O -p22,80 192.168.21.151 漏洞扫描 nmap --scriptvuln -p22,80 192.168.21.151 先去看看web页面 这里使用的是qdpm …...

【数据结构】排序算法(二)—>冒泡排序、快速排序、归并排序、计数排序
👀樊梓慕:个人主页 🎥个人专栏:《C语言》《数据结构》《蓝桥杯试题》《LeetCode刷题笔记》《实训项目》 🌝每一个不曾起舞的日子,都是对生命的辜负 目录 前言 1.冒泡排序 2.快速排序 2.1Hoare版 2.2占…...

SpringCloud-消息组件
1 简介 了解过RabbitMQ后,可能我们会遇到不同的系统在用不同的队列。比如系统A用的Kafka,系统B用的RabbitMQ,但是没了解过Kafka,因此可以使用Spring Stream,它能够屏蔽地产,像JDBC一样,只关心SQ…...

oringin的x轴(按x轴规定值)绘制不规律的横坐标
1.双击x轴 2.选择刻度线标签 3.选择刻度...
ubuntu安装MySQL
一行指令即可! sudo apt install mysql-server常用MySQL服务指令 sudo service mysql status # 查看服务状态 sudo service mysql start # 启动服务 sudo service mysql stop # 停止服务 sudo service mysql restart # 重启服务终端里面进入Mysql 其中-u后面root是我的用户名…...
背包问题学习笔记-多重背包问题
题意描述: 有 N 种物品和一个容量是 V 的背包。第 i 种物品最多有 si 件,每件体积是 vi,价值是 wi。求解将哪些物品装入背包,可使物品体积总和不超过背包容量,且价值总和最大。 输出最大价值。输入格式 第一行两个整数…...

Net相关的各类开源项目
Net相关的各类开源项目 WPFHandyControlLive-ChartsWPFDeveloperswpf-uidesignStylet WebScheduleMasterYiShaAdminBlog.CoreNebula.AdminNewLife.CubeOpenAuth UnityuGUIUnityCsReferenceEpitomeMyUnityFrameWorkKSFrameworkTowerDefense-GameFramework-Demo 通用ClientServer…...

阿里云服务器修改IP地址的两种方法
阿里云服务器可以更换IP地址吗?可以的,创建6小时以内的云服务器ECS可以免费更换三次公网IP地址,超过6小时的云服务器,可以将公网固定IP地址转成弹性EIP,然后通过换绑EIP的方式来更换IP地址。阿里云服务器网分享阿里云服…...
SpringMVC的数据绑定
一、前言 SpringMVC的数据绑定是指将HTTP请求参数绑定到Java对象上。这样可以方便地从请求中获取数据并将其传递给业务逻辑。在SpringMVC中,可以使用RequestParam和ModelAttribute等注解来实现数据绑定。 二、使用RequestParam注解 RequestParam注解用于将请求参…...
1.1.OpenCV技能树--第一单元--OpenCV简介
目录 1.文章内容来源 2.OpenCV简介 3.课后习题代码复现 4.易错点总结与反思 1.文章内容来源 1.题目来源:https://edu.csdn.net/skill/practice/opencv-77f629e4593845b0bf97e74ca8ec95ae/8292?languageopencv&materialId20807 2.资料来源:https://edu.csdn.net/skill…...

transformer不同的包加载模型的结构不一样
AutoModel AutoModelForTokenClassification 结论: AutoModel加载的模型与AutoModelForTokenClassification最后一层是不一样的,从这个模型来看,AutoModelForTokenClassification加载的结果是对的 问题: 为什么AutoModel和Aut…...

【MyBatis-Plus】快速精通Mybatis-plus框架—核心功能
刚才的案例中都是以id为条件的简单CRUD,一些复杂条件的SQL语句就要用到一些更高级的功能了。 1.条件构造器 除了新增以外,修改、删除、查询的SQL语句都需要指定where条件。因此BaseMapper中提供的相关方法除了以id作为where条件以外,还支持…...

C语言:选择+编程(每日一练Day9)
目录 选择题: 题一: 题二: 题三: 题四: 题五: 编程题: 题一:自除数 思路一: 题二:除自身以外数组的乘积 思路二: 本人实力有限可能对…...
蓝桥等考Python组别十三级003
第一部分:选择题 1、Python L13 (15分) 运行下面程序,输出的结果是( )。 t = (1, 2, 2, 1, 4, 3, 2) print(t.count(2)) 1234正确答案:C 2、Python L13 (...

2023年CSP-J真题详解+分析数据(选择题篇)
目录 前言 2023CSP-J江苏卷详解 小结 前言 下面由我来给大家讲解一下CSP-J的选择题部分。 2023CSP-J江苏卷详解 1.答案 A 解析:const在C中是常量的意思,其作用是声明一个变量,值从头至尾不能被修改 2.答案 D 解析:八进制…...

基于三平面映射的地形纹理化【Triplanar Mapping】
你可能遇到过这样的地形:悬崖陡峭的一侧的纹理拉伸得如此之大,以至于看起来不切实际。 也许你有一个程序化生成的世界,你无法对其进行 UV 展开和纹理处理。 推荐:用 NSDT编辑器 快速搭建可编程3D场景 三平面映射(Trip…...

初步了解nodejs语法和web模块
在此, 第一个Node.js实例_js firstnode-CSDN博客 通过node运行一个简单的server.js,实现了一个http服务器; 但是还没有解析server.js的代码,下面看一下; require 指令 在 Node.js 中,使用 require 指令来…...

Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
多场景 OkHttpClient 管理器 - Android 网络通信解决方案
下面是一个完整的 Android 实现,展示如何创建和管理多个 OkHttpClient 实例,分别用于长连接、普通 HTTP 请求和文件下载场景。 <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:android"http://schemas…...

学校招生小程序源码介绍
基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码,专为学校招生场景量身打造,功能实用且操作便捷。 从技术架构来看,ThinkPHP提供稳定可靠的后台服务,FastAdmin加速开发流程,UniApp则保障小程序在多端有良好的兼…...
Spring Boot面试题精选汇总
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot面试题精选汇总⚙️ **一、核心概…...
Spring Boot+Neo4j知识图谱实战:3步搭建智能关系网络!
一、引言 在数据驱动的背景下,知识图谱凭借其高效的信息组织能力,正逐步成为各行业应用的关键技术。本文聚焦 Spring Boot与Neo4j图数据库的技术结合,探讨知识图谱开发的实现细节,帮助读者掌握该技术栈在实际项目中的落地方法。 …...

使用Spring AI和MCP协议构建图片搜索服务
目录 使用Spring AI和MCP协议构建图片搜索服务 引言 技术栈概览 项目架构设计 架构图 服务端开发 1. 创建Spring Boot项目 2. 实现图片搜索工具 3. 配置传输模式 Stdio模式(本地调用) SSE模式(远程调用) 4. 注册工具提…...
Java数值运算常见陷阱与规避方法
整数除法中的舍入问题 问题现象 当开发者预期进行浮点除法却误用整数除法时,会出现小数部分被截断的情况。典型错误模式如下: void process(int value) {double half = value / 2; // 整数除法导致截断// 使用half变量 }此时...
JavaScript 数据类型详解
JavaScript 数据类型详解 JavaScript 数据类型分为 原始类型(Primitive) 和 对象类型(Object) 两大类,共 8 种(ES11): 一、原始类型(7种) 1. undefined 定…...
MySQL 8.0 事务全面讲解
以下是一个结合两次回答的 MySQL 8.0 事务全面讲解,涵盖了事务的核心概念、操作示例、失败回滚、隔离级别、事务性 DDL 和 XA 事务等内容,并修正了查看隔离级别的命令。 MySQL 8.0 事务全面讲解 一、事务的核心概念(ACID) 事务是…...

Linux nano命令的基本使用
参考资料 GNU nanoを使いこなすnano基础 目录 一. 简介二. 文件打开2.1 普通方式打开文件2.2 只读方式打开文件 三. 文件查看3.1 打开文件时,显示行号3.2 翻页查看 四. 文件编辑4.1 Ctrl K 复制 和 Ctrl U 粘贴4.2 Alt/Esc U 撤回 五. 文件保存与退出5.1 Ctrl …...