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

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(基于角色的访问…...

如何在Windows下使用Ollama本地部署DeepSeek R1

参考链接: 通过Ollama本地部署DeepSeek R1以及简单使用的教程(超详细) 【DeepSeek应用】DeepSeek R1 本地部署(OllamaDockerOpenWebUI) 如何将 Chatbox 连接到远程 Ollama 服务:逐步指南 首先需要安装oll…...

【分布式理论12】事务协调者高可用:分布式选举算法

文章目录 一、分布式系统中事务协调的问题二、分布式选举算法1. Bully算法2. Raft算法3. ZAB算法 三、小结与比较 一、分布式系统中事务协调的问题 在分布式系统中,常常有多个节点(应用)共同处理不同的事务和资源。前文 【分布式理论9】分布式…...

详细介绍Tess4J的使用:从PDF到图像的OCR技术实现

在当今的数字化时代,OCR(光学字符识别)技术被广泛应用于文档扫描、图片文字识别以及其他自动化数据提取任务。Tesseract作为一款强大的开源OCR引擎,在处理图像和PDF中的文本提取方面具有非常高的准确度和效率。本文将详细介绍如何…...

postgres源码学习之简单sql查询

postgres源码学习之sql查询 sql查询的主流程读取sql解析sql重写sql获得执行计划执行查询操作结果返回 sql查询的主流程 参考postgres的处理流程 由上一节,我们可以看到,当有新的连接通过权限认证之后,将进入等待接收sql语句,并执…...

C#项目05-猜数字多线程

本项目利用多线程,通过点击按钮猜数字, 知识点 线程 基本概念 进程:一组资源,构成一个正在运行的程序,这些资源包括地址空间、文件句柄以及程序启动需要的其他东西的载体。 线程:体现一个程序的真实执行情况, 线…...

前端504错误分析

前端出现504错误(网关超时)通常是由于代理服务器未能及时从上游服务获取响应。以下是详细分析步骤和解决方案: 1. 确认错误来源 504含义:代理服务器(如Nginx、Apache)在等待后端服务响应时超时。常见架构:前端 → 代理服务器 → 后端服务,问题通常出在代理与后端之间。…...

《C语言动态顺序表:从内存管理到功能实现》

1.顺序表 1.1 概念 顺序存储的线性表,叫顺序表。 1.2顺序表存放的实现方式 可以使用数组存储数据,可以实现逻辑上相连,物理内存上也相连。也可以使用malloc在堆区申请一片连续的空间,存放数据,实现逻辑上相连&#…...

通过API 调用本地部署 deepseek-r1 模型

如何本地部署 deepseek 请参考(windows 部署安装 大模型 DeepSeek-R1) 那么实际使用中需要开启API模式,这样可以无拘无束地通过API集成的方式,集成到各种第三方系统和应用当中。 上遍文章是基于Ollama框架运行了deepSeek R1模型…...

DeepSeek-学习与实践

1.应用场景 主要用于学习与使用DeepSeek解决问题, 提高效率. 2.学习/操作 1.文档阅读 文档 DeepSeek -- 官网, 直接使用 --- 代理网站 --- 极客智坊 https://poe.com/DeepSeek-R1 https://time.geekbang.com/search?qdeepseek -- 搜索deepseek的资料 资料 20250209DeepSeekC…...

DeepSeek和ChatGPT的全面对比

一、模型基础架构对比(2023技术版本) 维度DeepSeekChatGPT模型家族LLAMA架构改进GPT-4优化版本参数量级开放7B/35B/120B闭源175B位置编码RoPE NTK扩展ALiBiAttention机制FlashAttention-3FlashAttention-2激活函数SwiGLU ProGeGLU训练框架DeepSpeedMeg…...

无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解

对于做 Wi-Fi 的朋友,大家可能天天都需要配置各种加密和模式,但是有时候可能会一时忘记如何配置,基于日常的工作经验,总结了一篇文档:《无线网络安全配置指南:WPA、WPA2、WPA3及WAPI详解》,具体…...

撕碎QT面具(6):调节窗口大小后,控件被挤得重叠的解决方法

问题:控件重叠 分析原因:因为设置了最小大小,所以界面中的大小不会随窗口的变化而自动变化。 处理方案:修改mimumSize的宽度与高度为0,并设置sizePolicy为Expanding,让其自动伸缩。 结果展示(自…...

解锁机器学习核心算法 | K-平均:揭开K-平均算法的神秘面纱

一、引言 机器学习算法种类繁多,它们各自有着独特的优势和应用场景。前面我们学习了线性回归算法、逻辑回归算法、决策树算法。而今天,我们要深入探讨的是其中一种经典且广泛应用的聚类算法 —— K - 平均算法(K-Means Algorithm&#xff09…...

【Linux】匿名管道的应用场景-----管道进程池

目录 一、池化技术 二、简易进程池的实现: Makefile task.h task.cpp Initchannel函数: 创建任务: 控制子进程: 子进程执行任务: 清理收尾: 三、全部代码: 前言: 对于管…...

机器学习(1)安装Pytorch

1.安装命令 pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118 2.安装过程Log: Looking in indexes: https://download.pytorch.org/whl/cu118 Co…...

Linux 多Python版本统一和 PySpark 依赖 python 包方案

背景 Linux 服务器经常有多个Python版本,比如 Python2 有两个版本,Python3 有两个版本。在使用上容易混淆,而且有些需要新增一些 module 更容易,安装如果路径不统一,导致日常使用时,会出现找不到新安装mod…...

PostgreSQL的学习心得和知识总结(一百六十九)|深入理解PostgreSQL数据库之 Group By 键值消除 的使用和实现

目录结构 注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下: 1、参考书籍:《PostgreSQL数据库内核分析》 2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》 3、PostgreSQL数据库仓库…...

DeepSeek是什么?两种模型的对比?

最近DeepSeek的风也是很大,它也是很火,那么DeepSeek是什么呢? 什么是DeepSeek? DeepSeek是一家专注通用人工智能(AGI)的中国科技公司,主攻大模型研发与应用。DeepSeek-R1是其开源的推理模型&a…...

跟着 Lua 5.1 官方参考文档学习 Lua (2)

文章目录 2.3 – Variables2.4 – Statements2.4.1 – Chunks2.4.2 – Blocks2.4.3 – Assignment2.4.4 – Control Structures2.4.5 – For Statement2.4.6 – Function Calls as Statements2.4.7 – Local Declarations 2.3 – Variables Variables are places that store v…...

Python基于循环神经网络的情感分类系统(附源码,文档说明)

博主介绍:✌IT徐师兄、7年大厂程序员经历。全网粉丝15W、csdn博客专家、掘金/华为云//InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末获取源码联系🍅 👇🏻 精彩专栏推荐订阅👇&#x1f3…...

Zookeeper应用案例-分布式锁-实现思路

以下是具体实现代码 第一步:注册锁节点 第二步:获取锁节点,如果自己是最小的节点,就获取权限 第三步:拿到锁就开始自己的业务逻辑 第四步:业务逻辑好了就要释放这把锁 第五步:重新注册监听&…...

java练习(32)

ps:题目来自力扣 环形链表 给你一个链表的头节点 head ,判断链表中是否有环。 如果链表中有某个节点,可以通过连续跟踪 next 指针再次到达,则链表中存在环。 为了表示给定链表中的环,评测系统内部使用整数 pos 来表…...

伯克利 CS61A 课堂笔记 10 —— Trees

本系列为加州伯克利大学著名 Python 基础课程 CS61A 的课堂笔记整理,全英文内容,文末附词汇解释。 目录 01 Trees 树 Ⅰ Tree Abstraction Ⅱ Implementing the Tree Abstraction 02 Tree Processing 建树过程 Ⅰ Fibonacci tree Ⅱ Tree Process…...

让编程变成一种享受-明基RD320U显示器

引言 作为一名有着多年JAVA开发经验的从业者,在工作过程中,显示器的重要性不言而喻。它不仅是我们与代码交互的窗口,更是影响工作效率和体验的关键因素。在多年的编程生涯中,我遇到过各种各样的问题。比如,在进行代码…...

10分钟上手DeepSeek开发:SpringBoot + Vue2快速构建AI对话系统

作者:后端小肥肠 目录 1. 前言 为什么选择DeepSeek? 本文技术栈 2. 环境准备 2.1. 后端项目初始化 2.2. 前端项目初始化 3. 后端服务开发 3.1. 配置文件 3.2. 核心服务实现 4. 前端服务开发 4.1. 聊天组件ChatWindow.vue开发 5. 效果展示及源…...

LeetCode 0624.数组列表中的最大距离:只关心最小最大值

【LetMeFly】624.数组列表中的最大距离:只关心最小最大值 力扣题目链接:https://leetcode.cn/problems/maximum-distance-in-arrays/ 给定 m 个数组,每个数组都已经按照升序排好序了。 现在你需要从两个不同的数组中选择两个整数&#xff…...

如何解决服务器端口被攻击:全面防护与快速响应

服务器端口被攻击是网络安全中常见的问题之一,尤其是当服务器暴露在公共网络上时,容易成为黑客的目标。攻击者可能通过扫描开放端口、利用漏洞或发动拒绝服务(DoS/DDoS)攻击来破坏服务器的正常运行。本文将详细介绍如何检测、防御…...

Golang深度学习

前言 在2009年,Google公司发布了一种新的编程语言,名为Go(或称为Golang),旨在提高编程效率、简化并发编程,并提供强大的标准库支持。Go语言的设计者们希望通过Go语言能够解决软件开发中的一些长期存在的问…...

Linux环境开发工具

Linux软件包管理器yum Linux下安装软件方式: 源代码安装rpm安装——Linux安装包yum安装——解决安装源、安装版本、安装依赖的问题 yum对应于Windows系统下的应用商店 使用Linux系统的人:大部分是职业程序员 客户端怎么知道去哪里下载软件&#xff1…...