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,提升应用的安全性和管理效率。

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

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

相关文章

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:10.第三方组件element-ui_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据,也可由父组件通过prop方式传…

【算法通关村 Day7】递归与二叉树遍历

递归与二叉树遍历青铜挑战 理解递归 递归算法是指一个方法在其执行过程中调用自身。它通常用于将一个问题分解为更小的子问题,通过重复调用相同的方法来解决这些子问题,直到达到基准情况(终止条件)。 递归算法通常包括两个主要…

朴素贝叶斯法

文章目录 贝叶斯定理朴素贝叶斯法的学习与分类条件独立假设朴素贝叶斯的后验概率最大化准则朴素贝叶斯的基本公式 朴素贝叶斯法的参数估计极大似然估计 贝叶斯定理 前置知识:条件概率、全概率、贝叶斯公式 推荐视频,看完视频后搜索博客了解先验概率、后…

《A++ 敏捷开发》- 20 从 AI 到最佳设计

“我们现在推行AIGC,服务端不需要UI交互设计的用AI自动产出代码,你建议的结对编程、TDD等是否还适用?” 这两年AI确实很火,是报纸、杂志的热门话题。例如,HBR杂志从2024年9月至2025年二月份3期,里面有接近一…

GO系列-IO 文件操作

os io 判断文件是否存在 func fileExist(filePath string) (bool, error) {_, err : os.Stat(filePath)if err nil {return true, nil}if os.IsNotExist(err) {return false, nil}return false, &CheckFileExistError{filePath} } 读取文件内容 func readFileContext(…

rs485协议、电路详解(保姆级)

起源 RS-485即Recommended Standard 485 协议的简写。1983年被电子工业协会(EIA)批准为一种通讯接口标准. 数据在通信双方之间传输,本质是传输物理的电平,比方说传输5V的电压 -1V的电压信号,这些物理信号在传输过程中会受到很多干扰&#x…

JavaWeb-Tomcat服务器

文章目录 Web服务器存在的意义关于Web服务器软件Tomcat服务器简介安装Tomcat服务器Tomcat服务器源文件解析配置Tomcat的环境变量启动Tomcat服务器一个最简单的webapp(不涉及Java) Web服务器存在的意义 我们之前介绍过Web服务器进行通信的原理, 但是我们当时忘记了一点, 服务器…

【愚公系列】《Python网络爬虫从入门到精通》008-正则表达式基础

标题详情作者简介愚公搬代码头衔华为云特约编辑,华为云云享专家,华为开发者专家,华为产品云测专家,CSDN博客专家,CSDN商业化专家,阿里云专家博主,阿里云签约作者,腾讯云优秀博主,腾讯云内容共创官,掘金优秀博主,亚马逊技领云博主,51CTO博客专家等。近期荣誉2022年度…

视觉分析之边缘检测算法

9.1 Roberts算子 Roberts算子又称为交叉微分算法,是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。 其缺点是对边缘的定位…

DuodooBMS源码解读之 sale_change模块

销售变更模块用户使用手册 一、模块概述 本扩展模块主要包含两个主要的 Python 文件:sale_change/report/sale_change_report.py 和 sale_change/wizard/sale_change_download.py,提供了销售变更报表查看和销售变更单下载的功能。以下是详细的使用说明…

OpenCV形态学操作

1.1. 形态学操作介绍 初识: 形态学操作是一种基于图像形状的处理方法,主要用于分析和处理图像中的几何结构。其核心是通过结构元素(卷积核)对图像进行扫描和操作,从而改变图像的形状和特征。例如: 腐蚀&…

力扣算法-1

力扣算法 1 两数之和 给定一个整数数组nums和一个整数目标值target,请你在数组中找出和为目标值target的那两个整数,返回他们的数组下标。 (1)暴力枚举 (枚举数组每一个数x,再寻找数组中是否存在 targe…

pyside6学习专栏(三):自定义QLabel标签扩展类QLabelEx

标签是界面设计中最常用的控件,本文演示了如何基于PySide6的QLabex控件类扩展定义QLabelEX类,以实现更少的编码完成各种图像、彩色文本、动画的加载和显示,丰富界面显示 本示例演示了QLabel和其扩展类QLabelEx分别显示文本、图像、动画的使用…

从0到1:固件分析

固件分析 0x01 固件提取 1、从厂商官网下载 例如D-link的固件: https://support.dlink.com/resource/products/ 2、代理或镜像设备更新时的流量 发起中间人攻击MITM #启用IP转发功能 echo 1 > /proc/sys/net/ipv4/ip_forward#配置iptables,将目…

使用 Spring Boot 和 Canal 实现 MySQL 数据库同步

文章目录 前言一、背景二、Canal 简介三、主库数据库配置1.主库配置2.创建 Canal 用户并授予权限 四.配置 Canal Server1.Canal Server 配置文件2.启动 Canal Server 五.开发 Spring Boot 客户端1. 引入依赖2. 配置 Canal 客户端3. 实现数据同步逻辑 六.启动并测试七.注意事项八…

Linux系统配置阿里云yum源,安装docker

配置阿里云yum源 需要保证能够访问阿里云网站 可以先ping一下看看(阿里云可能禁ping,只要能够解析为正常的ip地址即可) ping mirrors.aliyun.com脚本 #!/bin/bash mkdir /etc/yum.repos.d/bak mv /etc/yum.repos.d/*.repo /etc/yum.repos…

后端开发:开启技术世界的新大门

在互联网的广阔天地中,后端开发宛如一座大厦的基石,虽不直接与用户 “面对面” 交流,却默默地支撑着整个互联网产品的稳定运行。它是服务器端编程的核心领域,负责处理数据、执行业务逻辑以及与数据库和其他后端服务进行交互。在当…

银河麒麟系统安装mysql5.7【亲测可行】

一、安装环境 cpu:I5-10代; 主板:华硕; OS:银河麒麟V10(SP1)未激活 架构:Linux 5.10.0-9-generic x86_64 GNU/Linux mysql版本:mysql-5.7.34-linux-glibc2.12-x86_64.ta…

从零开始学习PX4源码9(部署px4源码到gitee)

目录 文章目录 目录摘要1.gitee上创建仓库1.1 gitee上创建仓库PX4代码仓库1.2 gitee上创建子仓库2.固件在gitee部署过程2.1下载固件到本地2.2切换本地分支2.3修改.gitmodules内容2.4同步子模块仓库地址2.5同步子模块仓库地址更新(下载)子模块3.一级子模块和二级子模块的映射关…

【回溯算法2】

力扣17.电话号码的字母组合 链接: link 思路 这道题容易想到用嵌套的for循环实现,但是如果输入的数字变多,嵌套的for循环也会变长,所以暴力破解的方法不合适。 可以定义一个map将数字和字母对应,这样就可以获得数字字母的映射了…