Casbin 权限管理介绍及在 Go 语言中的使用入门
引言
在现代软件开发过程中,权限管理是一个至关重要的环节,它关系到系统的安全性和用户体验。Casbin 是一个强大的访问控制库,支持多种访问控制模型,如 ACL(访问控制列表)、RBAC(基于角色的访问控制)、ABAC(基于属性的访问控制)等。Casbin 可以方便地集成到各种应用中,提供灵活的权限定义和管理机制。
本文将重点介绍 Casbin 在 Go 语言中的使用,并结合前面提到的配置信息,帮助大家快速入门。
安装 Casbin
首先,我们需要在 Go 项目中安装 Casbin。可以通过 go get 命令来安装:
go get github.com/casbin/casbin/v2
基本概念
在 Casbin 中,权限管理的核心模型由请求定义、策略定义、策略效果和匹配器四部分组成。下面逐一解释这些概念。
请求定义(Request Definition)
请求定义描述了访问请求的结构。最常见的是 r = sub, obj, act,其中:
sub:表示请求发起的主体(通常是用户或服务)。obj:表示请求要访问的对象(比如文件、API 等)。act:表示主体对对象执行的操作(比如读取、写入、删除等)。
例如,r = sub, obj, act 表示一个请求由发起主体、操作对象和操作类型组成。
策略定义(Policy Definition)
策略定义描述了权限策略的结构。同样常见的结构是 p = sub, obj, act,其中:
sub:表示策略中的主体。obj:表示策略中的对象。act:表示策略中的操作类型。
策略定义与请求定义的结构保持一致,便于匹配。
策略效果(Policy Effect)
策略效果定义了如何合并多个匹配的策略规则来决定最终的访问结果。常见的策略效果有:
e = some(where (p.eft == allow)):只要有一个策略规则允许,则允许访问。e = !some(where (p.eft == deny)):如果没有一个策略规则拒绝,则允许访问。e = all(where (p.eft == allow)):所有的策略规则都允许,才允许访问。
在以下配置中:
e = some(where (p.eft == allow))表示只要有一个策略规则允许访问,就允许访问。
匹配器(Matchers)
匹配器定义了如何将请求与策略规则进行匹配。常见的匹配器有:
r.sub == p.sub && r.obj == p.obj && r.act == p.act:完全匹配。r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act):部分匹配,其中keyMatch用于字符串前缀匹配,regexMatch用于正则表达式匹配。
在以下配置中:
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"表示主体与策略主体相匹配,且对象通过前缀匹配,操作通过正则表达式匹配,或者主体是root时允许访问。
配置文件详解
Casbin 使用配置文件来定义具体的访问控制模型。一个典型的配置文件如下:
[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"
- 请求定义:
r = sub, obj, act表示请求由主体、对象和操作组成。 - 策略定义:
p = sub, obj, act表示策略由主体、对象和操作组成。 - 策略效果:
e = some(where (p.eft == allow))表示只要有一个策略规则允许访问,就允许访问。 - 匹配器:
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"表示主体与策略主体相匹配,且对象通过前缀匹配,操作通过正则表达式匹配,或者主体是root时允许访问。
在 Gin 框架中使用 Casbin
下面是一个简单的例子,介绍如何在 Gin 框架中集成 Casbin 进行权限管理。
1. 安装依赖
go get github.com/casbin/casbin/v2
go get github.com/gin-gonic/gin
2. 初始化 Casbin
创建一个 casbin_model.conf 文件,内容如下:
[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[policy_effect]
e = some(where (p.eft == allow))[matchers]
r.sub == p.sub && keyMatch(r.obj, p.obj) && regexMatch(r.act, p.act) || r.sub == "root"
创建一个 casbin_policy.csv 文件,内容如下:
p, alice, /api/data, GET
p, bob, /api/data, POST
p, admin, /api/*, (GET)|(POST)|(DELETE)
3. 编写 Gin 代码
使用csv文件存储权限配置。
package mainimport ("github.com/casbin/casbin/v2""github.com/casbin/casbin/v2/model""github.com/gin-gonic/gin""net/http"
)func main() {// 加载模型和策略文件m, _ := model.NewModelFromFile("casbin_model.conf")e, _ := casbin.NewEnforcer(m, "casbin_policy.csv")// 创建 Gin 引擎r := gin.Default()// 权限验证中间件authMiddleware := func(c *gin.Context) {sub := c.GetHeader("X-User") // 从请求头中获取用户信息obj := c.Request.URL.Path // 获取请求路径act := c.Request.Method // 获取请求方法if !e.Enforce(sub, obj, act) {c.JSON(http.StatusForbidden, gin.H{"error": "forbidden"})c.Abort()}}// 定义路由r.GET("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"data": "Here is your data"})})r.POST("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Data created successfully"})})// 启动服务r.Run(":8080")
}
4. 使用 GORM 适配器初始化 Casbin
上述示例,创建一个 casbin_policy.csv 文件的方式编辑权限不方便使用。一般会把权限配置在数据库中方便管理。
GORM 是一个功能强大的 Go 语言 ORM(对象关系映射)库,可以简化数据库操作,使开发者能够更专注于业务逻辑。GORM Casbin 适配器允许你将 Casbin 的策略存储在数据库中,通过 GORM 进行操作,从而实现更复杂的权限管理。
下面介绍 GORM 的基本使用方法及其在 Casbin 中的适配器。
GORM适配器是什么?
GORM适配器是Casbin与GORM(Go语言的ORM库)之间的桥梁,允许你将Casbin的策略存储在支持GORM的数据库中,比如MySQL、PostgreSQL、SQLite等,而不是默认的CSV文件。GORM(Go Object Relational Mapping)是一个用于Go程序的ORM库,它使得数据库操作更加简便和类型安全。
GORM适配器做什么用?
GORM适配器的主要用途是将Casbin的策略存储在数据库中,从而提供更持久化、可扩展的权限管理解决方案。使用GORM适配器可以带来以下好处:
- 持久化存储:策略可以存储在数据库中,即使应用重启,策略依然存在。
- 可扩展性:使用数据库可以存储大量的策略规则,处理复杂的权限逻辑。
- 灵活性:可以通过数据库查询、更新策略规则,而不是手动编辑CSV文件。
- 事务支持:在更新策略时,可以利用数据库的事务机制,确保数据的一致性和完整性。
如何在Casbin中使用GORM适配器?
首先,你需要安装GORM适配器。你可以使用以下命令来安装:
go get github.com/casbin/gorm-adapter/v2
接下来,你需要修改之前的代码,以支持GORM适配器。假设你使用的是MySQL数据库,以下是具体步骤:
1. 安装GORM和MySQL驱动
go get -u gorm.io/gorm
go get -u gorm.io/driver/mysql
2. 修改初始化Casbin的部分
package mainimport ("gorm.io/driver/mysql""gorm.io/gorm""github.com/casbin/casbin/v2""github.com/casbin/gorm-adapter/v2""github.com/gin-gonic/gin""net/http"
)func main() {// 连接数据库dsn := "user:password@tcp(127.0.0.1:3306)/dbname?charset=utf8mb4&parseTime=True&loc=Local"db, err := gorm.Open(mysql.Open(dsn), &gorm.Config{})if err != nil {panic(err)}// 初始化GORM适配器a, err := gormadapter.NewAdapter(db) // db is your GORM databaseif err != nil {panic(err)}// 加载模型和策略文件m, _ := model.NewModelFromFile("casbin_model.conf")e, _ := casbin.NewEnforcer(m, a)// 添加策略e.AddPolicy("alice", "/api/data", "GET")e.AddPolicy("bob", "/api/data", "POST")e.AddPolicy("admin", "/api/*", "(GET)|(POST)|(DELETE)")// 自动迁移模式a.CreateTables()// 或者从 CSV 文件加载策略// e.LoadPolicyFile("casbin_policy.csv")// 创建 Gin 引擎r := gin.Default()// 权限验证中间件authMiddleware := func(c *gin.Context) {sub := c.GetHeader("X-User") // 从请求头中获取用户信息obj := c.Request.URL.Path // 获取请求路径act := c.Request.Method // 获取请求方法if !e.Enforce(sub, obj, act) {c.JSON(http.StatusForbidden, gin.H{"error": "forbidden"})c.Abort()}}// 定义路由r.GET("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"data": "Here is your data"})})r.POST("/api/data", authMiddleware, func(c *gin.Context) {c.JSON(http.StatusOK, gin.H{"message": "Data created successfully"})})// 启动服务r.Run(":8080")
}
5. 测试接口
- 使用
curl或 Postman 等工具发送请求。 - 通过设置不同的请求头中的
X-User值来测试不同的用户权限。
curl -H "X-User: alice" http://localhost:8080/api/data
curl -H "X-User: bob" -X POST http://localhost:8080/api/data
curl -H "X-User: admin" -X DELETE http://localhost:8080/api/data
6. 处理错误
如果请求未通过权限验证,Casbin 将返回 403 Forbidden 错误。
7. 注意事项
- 配置文件路径:确保
casbin_model.conf和casbin_policy.csv文件路径正确。 - 请求头:本例中通过请求头
X-User来传递用户信息,实际应用中可以根据需要调整。 - 策略文件格式:策略文件中的策略规则需要符合模型定义的结构。
结论
通过本文的学习,你应该已经掌握了 Casbin 的基本概念和在 Go 框架下的使用方法。Casbin 提供了强大的访问控制功能,可以帮助你更好地管理应用中的权限。希望这个入门指南能够对你有所帮助!
参考资料
- Casbin 官方文档
- Casbin GitHub 仓库
- GORM 官方文档
- GORM Casbin 适配器 GitHub 仓库
如果你在使用过程中遇到任何问题,欢迎随时提问。希望你能够在项目中顺利集成 Casbin和GROM,提升应用的安全性和管理效率。
相关文章:
Casbin 权限管理介绍及在 Go 语言中的使用入门
引言 在现代软件开发过程中,权限管理是一个至关重要的环节,它关系到系统的安全性和用户体验。Casbin 是一个强大的访问控制库,支持多种访问控制模型,如 ACL(访问控制列表)、RBAC(基于角色的访问…...
Two Sum
声明:博主为算法新手,博客仅作为个人学习记录 作为新手我的做法 (1)数组nums遍历一遍挑选出小于target的值及其下标,值存入temp,下标存到indices (2)遍历temp找到符合temp[i]temp[j]target的两个…...
3.3.2 交易体系构建——缠论操作思路
本节我们基于交易目标(规避下跌趋势,参与上涨趋势)来构建基于上涨趋势的缠论交易体系。建立上涨趋势的缠论交易体系需要以下几个步骤: 识别下跌走势大概率完成的位置 等待出现转折结构 确定交易模型并交易 从概率的角度来说,判断走势结束是个概率事件。为构建成功较高的交…...
[SQL] 事务的四大特性(ACID)
🎄事务的四大特性 以下就是事务的四大特性,简称ACID。 原子性📢事务时不可分割的最小操作单元,要么全部成功,要么全部失败。一致性📢事务完成后,必须使所有的数据都保持一致隔离性📢…...
使用 Three.js 实现流光特效
大家好!我是 [数擎AI],一位热爱探索新技术的前端开发者,在这里分享前端和 Web3D、AI 技术的干货与实战经验。如果你对技术有热情,欢迎关注我的文章,我们一起成长、进步! 开发领域:前端开发 | AI…...
Error [ERR_REQUIRE_ESM]: require() of ES Module
报错信息: 【报错】Message.js 导入方式不对,用的是 ES Moudle 的语法,提示使用 import 引入文件 项目开发没有用到 js-message 依赖,是 node-ipc 依赖中用到的 js-message 依赖, node-ipc 中限制 js-message 版本&a…...
沉浸式翻译插件深度评测:打破语言壁垒的黑科技利器
在信息爆炸的时代,语言障碍成为了许多人获取信息的一大难题。尤其是在浏览外文网站、观看外语视频或阅读外文文档时,语言不通往往会让人倍感困扰。然而,一款名为沉浸式翻译的黑科技插件,却以其强大的翻译能力和便捷的使用体验,成为了众多用户打破语言壁垒的首选工具。本文…...
Java 中 HTTP 协议版本使用情况剖析
Java 中 HTTP 协议版本使用情况剖析 一、HTTP/1.1 与 HTTP/2 概述 (一)HTTP/1.1 HTTP/1.1 是广泛应用且成熟的 HTTP 协议版本,它在互联网发展历程中扮演了重要角色。其特点主要包括: 连接方式:默认采用短连接,即每次请求都要建立新的 TCP 连接,请求完成后断开。不过也…...
蓝桥杯学习大纲
(致酷德与热爱算法、编程的小伙伴们) 在查阅了相当多的资料后,发现没有那篇博客、文章很符合我们备战蓝桥杯的学习路径。所以,干脆自己整理一篇,欢迎大家补充! 一、题型分布: 题型分布为填空…...
VSCode ssh远程连接内网服务器(不能上网的内网环境的Linux服务器)的终极解决方案
VSCode ssh远程连接内网服务器(不能上网的内网环境的Linux服务器) 离线下载vscode-server并安装: 如果远程端不能联网可以下载包离线安装,下载 vscode-server 的 url 需要和 vscode 客户端版本的 commit-id 对应.通过 vscode 面板的帮助->关于可以获…...
【多模态处理篇五】【DeepSeek文档解析:PDF/Word智能处理引擎】
你知道吗?全球每天产生的PDF文档超过10亿份,但90%的上班族还在用复制粘贴的笨办法处理文档!DeepSeek文档解析引擎就像给你的电脑装上了"文档翻译官",能把PDF/Word里的文字、表格、公式甚至排版样式都变成AI能理解的"语言"。举个真实场景:法务小姐姐用…...
STM32-心知天气项目
一、项目需求 使用 ESP8266 通过 HTTP 获取天气数据(心知天气),并显示在 OLED 屏幕上。 按键 1 :循环切换今天 / 明天 / 后天天气数据; 按键 2 :更新天气。 二、项目框图 三、cjson作用 https://gi…...
cs106x-lecture14(Autumn 2017)-SPL实现
打卡cs106x(Autumn 2017)-lecture14 (以下皆使用SPL实现,非STL库,后续课程结束会使用STL实现) 1、min Write a function named min that accepts a pointer to a ListNode representing the front of a linked list. Your function should return the …...
基于STM32的智能家居语音系统(单片机毕设)
前言 源代码下载链接: https://download.csdn.net/download/m0_74712453/90071680 需要实物的可以私信博主或者在文章最下方添加好友。 目录 一、项目介绍和演示视频 二、硬件实现 1. 材料材料 2. 原理图和PCB 三、软件实现 1. 代码解析 1.1 main函数 1.2…...
ASP.NET Core 简单文件上传
使用异步 JavaScript 和 XML(AJAX)进行简单的文件上传;用 C# 编写的服务器端代码。 使用AJAX和ASP.NET Core MVC上传文件再简单不过了。这不依赖于jQuery。此代码允许上传多个文件,并与 .NET Core 3.1、.NET 6和.NET 8兼容。 如果…...
2502C++,C++继承的多态性
构 A{单 向量<串>记;元<类 T>静 空 ff(串&a){清理(记);名向量(a,记);串 b{"---ff---"};打印(b);T::g();} };构 B:公 A{元<类 T>静 空 f(){串 a{"错误.txt"};ff<T>(a);} };构 C:公 A{元<类 T>静 空 f(){串 a{"a12.c…...
【机器学习】13.十大算法之一K均值算法(K-means)聚类详细讲解
【机器学习】13.十大算法之一K均值算法(K-means)聚类详细讲解 一摘要二个人简介三K-均值聚类(K-means)3.1-K均值算法的基本原理3.1.1- 聚类分析的目标3.1.2- K - means算法算法原理 四K-means聚类算法的收敛性五证明K均值算法的收…...
Spring扩展点之Mybatis整合模拟
Spring扩展点之Mybatis整合 单独使用MyBaitis模拟整合MyBatis到Spring 单独使用MyBaitis 通过配置文件生成sqlSessionFactory,用sqlSessionFactory开启session。通过session获取到mapper执行对应的sql。 InputStream inputStream Resources.getResourceAsStream(…...
.NET MVC实现电影票管理
.NET MVC(Model-View-Controller)是微软推出的基于 Model-View-Controller 设计模式的 Web 应用框架,属于 ASP.NET Core 的重要组成部分。其核心目标是通过清晰的分层架构实现 高内聚、低耦合 的开发模式,适用于构建可扩展的企业级…...
自媒体账号管理工具:创作罐头使用指南
创作罐头使用指南 1. 关于创作罐头 创作罐头是免费的一站式自媒体运营工具,支持各大自媒体平台多账号管理、全网爆文库、原创检测、视频一键分发、团队管理、各平台数据分析等功能。 2. 安装与注册 2.1. 如何安装创作罐头 从我们的官网下载并安装软件 www.czgts.…...
java_网络服务相关_gateway_nacos_feign区别联系
1. spring-cloud-starter-gateway 作用:作为微服务架构的网关,统一入口,处理所有外部请求。 核心能力: 路由转发(基于路径、服务名等)过滤器(鉴权、限流、日志、Header 处理)支持负…...
Linux简单的操作
ls ls 查看当前目录 ll 查看详细内容 ls -a 查看所有的内容 ls --help 查看方法文档 pwd pwd 查看当前路径 cd cd 转路径 cd .. 转上一级路径 cd 名 转换路径 …...
cf2117E
原题链接:https://codeforces.com/contest/2117/problem/E 题目背景: 给定两个数组a,b,可以执行多次以下操作:选择 i (1 < i < n - 1),并设置 或,也可以在执行上述操作前执行一次删除任意 和 。求…...
生成 Git SSH 证书
🔑 1. 生成 SSH 密钥对 在终端(Windows 使用 Git Bash,Mac/Linux 使用 Terminal)执行命令: ssh-keygen -t rsa -b 4096 -C "your_emailexample.com" 参数说明: -t rsa&#x…...
c#开发AI模型对话
AI模型 前面已经介绍了一般AI模型本地部署,直接调用现成的模型数据。这里主要讲述讲接口集成到我们自己的程序中使用方式。 微软提供了ML.NET来开发和使用AI模型,但是目前国内可能使用不多,至少实践例子很少看见。开发训练模型就不介绍了&am…...
JVM暂停(Stop-The-World,STW)的原因分类及对应排查方案
JVM暂停(Stop-The-World,STW)的完整原因分类及对应排查方案,结合JVM运行机制和常见故障场景整理而成: 一、GC相关暂停 1. 安全点(Safepoint)阻塞 现象:JVM暂停但无GC日志,日志显示No GCs detected。原因:JVM等待所有线程进入安全点(如…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
#Uniapp篇:chrome调试unapp适配
chrome调试设备----使用Android模拟机开发调试移动端页面 Chrome://inspect/#devices MuMu模拟器Edge浏览器:Android原生APP嵌入的H5页面元素定位 chrome://inspect/#devices uniapp单位适配 根路径下 postcss.config.js 需要装这些插件 “postcss”: “^8.5.…...
三分算法与DeepSeek辅助证明是单峰函数
前置 单峰函数有唯一的最大值,最大值左侧的数值严格单调递增,最大值右侧的数值严格单调递减。 单谷函数有唯一的最小值,最小值左侧的数值严格单调递减,最小值右侧的数值严格单调递增。 三分的本质 三分和二分一样都是通过不断缩…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
