当前位置: 首页 > news >正文

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适配器可以带来以下好处:

  1. 持久化存储:策略可以存储在数据库中,即使应用重启,策略依然存在。
  2. 可扩展性:使用数据库可以存储大量的策略规则,处理复杂的权限逻辑。
  3. 灵活性:可以通过数据库查询、更新策略规则,而不是手动编辑CSV文件。
  4. 事务支持:在更新策略时,可以利用数据库的事务机制,确保数据的一致性和完整性。

如何在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.confcasbin_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。 原子性📢事务时不可分割的最小操作单元,要么全部成功,要么全部失败。一致性📢事务完成后,必须使所有的数据都保持一致隔离性&#x1f4e2…...

使用 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均值算法&#xff08;K-means&#xff09;聚类详细讲解 一摘要二个人简介三K-均值聚类&#xff08;K-means&#xff09;3.1-K均值算法的基本原理3.1.1- 聚类分析的目标3.1.2- K - means算法算法原理 四K-means聚类算法的收敛性五证明K均值算法的收…...

Spring扩展点之Mybatis整合模拟

Spring扩展点之Mybatis整合 单独使用MyBaitis模拟整合MyBatis到Spring 单独使用MyBaitis 通过配置文件生成sqlSessionFactory&#xff0c;用sqlSessionFactory开启session。通过session获取到mapper执行对应的sql。 InputStream inputStream Resources.getResourceAsStream(…...

.NET MVC实现电影票管理

.NET MVC&#xff08;Model-View-Controller&#xff09;是微软推出的基于 Model-View-Controller 设计模式的 Web 应用框架&#xff0c;属于 ASP.NET Core 的重要组成部分。其核心目标是通过清晰的分层架构实现 高内聚、低耦合 的开发模式&#xff0c;适用于构建可扩展的企业级…...

自媒体账号管理工具:创作罐头使用指南

创作罐头使用指南 1. 关于创作罐头 创作罐头是免费的一站式自媒体运营工具&#xff0c;支持各大自媒体平台多账号管理、全网爆文库、原创检测、视频一键分发、团队管理、各平台数据分析等功能。 2. 安装与注册 2.1. 如何安装创作罐头 从我们的官网下载并安装软件 www.czgts.…...

CardEditor:桌游设计师的终极卡牌批量生成指南,效率提升300%

CardEditor&#xff1a;桌游设计师的终极卡牌批量生成指南&#xff0c;效率提升300% 【免费下载链接】CardEditor 一款专为桌游设计师开发的批处理数值填入卡牌生成器/A card batch generator specially developed for board game designers 项目地址: https://gitcode.com/g…...

如何3分钟完成Windows和Office智能激活?KMS_VL_ALL_AIO终极指南

如何3分钟完成Windows和Office智能激活&#xff1f;KMS_VL_ALL_AIO终极指南 【免费下载链接】KMS_VL_ALL_AIO Smart Activation Script 项目地址: https://gitcode.com/gh_mirrors/km/KMS_VL_ALL_AIO 还在为Windows系统激活烦恼吗&#xff1f;每次重装系统后都要面对繁琐…...

D2RML:暗黑破坏神2重制版多开神器,让你告别繁琐登录的终极解决方案

D2RML&#xff1a;暗黑破坏神2重制版多开神器&#xff0c;让你告别繁琐登录的终极解决方案 【免费下载链接】D2RML Diablo 2 Resurrected Multilauncher 项目地址: https://gitcode.com/gh_mirrors/d2/D2RML 还在为切换暗黑2重制版账户而烦恼吗&#xff1f;每次登录战网…...

从零到精:ARL灯塔在HW行动中的实战应用与策略配置避坑指南

从零到精&#xff1a;ARL灯塔在HW行动中的实战应用与策略配置避坑指南 在当今企业安全攻防演练&#xff08;HW&#xff09;中&#xff0c;资产测绘的全面性与效率直接决定了红队行动的成败。面对庞大的目标范围和有限的时间窗口&#xff0c;传统手工收集方式已难以满足实战需求…...

出飞鸟源码运营版本可开房

出飞鸟源码运营版本可无限开房H5大唐新圣飞鸟天信28旗舰28大唐飞鸟 源码搭建出租回调 机器人 聚宝bv...

告别枯燥理论!用Python+Matplotlib动手仿真通信原理:从ASK调制到星座图分析

告别枯燥理论&#xff01;用PythonMatplotlib动手仿真通信原理&#xff1a;从ASK调制到星座图分析 通信原理常被视为电子工程领域最抽象的课程之一&#xff0c;充斥着大量数学公式和概念推导。但当我们用Python代码将这些理论可视化时&#xff0c;那些晦涩的术语会突然变得生动…...

Spring AI MCP服务如何选择使用 WebMVC还是WebFlux

在 Spring AI MCP 服务中选择使用 WebMVC 还是 WebFlux&#xff0c;主要取决于你项目的技术栈和性能需求。 简单来说&#xff0c;如果你的项目是传统的 Spring MVC 应用&#xff0c;就选 WebMVC&#xff1b;如果是响应式编程项目或需要处理高并发&#xff0c;就选 WebFlux。 下…...

从《我的第一份工作》看技术面试:如何避免踩中那些‘令人沮丧的旅程’和‘最后一根稻草’

技术面试避坑指南&#xff1a;从经典文学拆解职场生存法则 伦敦郊外那所红砖学校的面试经历&#xff0c;放在今天的技术招聘场景中依然能引发强烈共鸣——不专业的面试官、模糊的岗位职责、糟糕的办公环境&#xff0c;以及最后那根压垮求职者的"稻草"。这些上世纪文学…...

区块链与AI融合架构深度解析:一位测试工程师的专业视角

当分布式账本遇见智能算法“区块链AI”已成为当下技术领域最富想象力的融合方向之一。对于软件测试从业者而言&#xff0c;理解这一融合架构不仅是技术视野的拓展&#xff0c;更是测试思维范式的一次重要升级。本文将从专业测试视角出发&#xff0c;通过一张核心架构图&#xf…...

超好用的截图工具——Snipaste

文章目录超好用的截图工具——Snipaste核心定位安全下载极简安装与基础配置&#xff08;1分钟搞定&#xff09;安装开机自启核心快捷键关闭不必要的提醒核心功能全流程实操① 基础截图 标注② 灵魂功能——贴图&#xff08;效率核心&#xff09;典型使用场景超好用的截图工具—…...