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.…...
龙虎榜——20250610
上证指数放量收阴线,个股多数下跌,盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型,指数短线有调整的需求,大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的:御银股份、雄帝科技 驱动…...
在rocky linux 9.5上在线安装 docker
前面是指南,后面是日志 sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo sudo dnf install docker-ce docker-ce-cli containerd.io -y docker version sudo systemctl start docker sudo systemctl status docker …...
visual studio 2022更改主题为深色
visual studio 2022更改主题为深色 点击visual studio 上方的 工具-> 选项 在选项窗口中,选择 环境 -> 常规 ,将其中的颜色主题改成深色 点击确定,更改完成...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
sipsak:SIP瑞士军刀!全参数详细教程!Kali Linux教程!
简介 sipsak 是一个面向会话初始协议 (SIP) 应用程序开发人员和管理员的小型命令行工具。它可以用于对 SIP 应用程序和设备进行一些简单的测试。 sipsak 是一款 SIP 压力和诊断实用程序。它通过 sip-uri 向服务器发送 SIP 请求,并检查收到的响应。它以以下模式之一…...
浪潮交换机配置track检测实现高速公路收费网络主备切换NQA
浪潮交换机track配置 项目背景高速网络拓扑网络情况分析通信线路收费网络路由 收费汇聚交换机相应配置收费汇聚track配置 项目背景 在实施省内一条高速公路时遇到的需求,本次涉及的主要是收费汇聚交换机的配置,浪潮网络设备在高速项目很少,通…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
【LeetCode】3309. 连接二进制表示可形成的最大数值(递归|回溯|位运算)
LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 题目描述解题思路Java代码 题目描述 题目链接:LeetCode 3309. 连接二进制表示可形成的最大数值(中等) 给你一个长度为 3 的整数数组 nums。 现以某种顺序 连接…...
ThreadLocal 源码
ThreadLocal 源码 此类提供线程局部变量。这些变量不同于它们的普通对应物,因为每个访问一个线程局部变量的线程(通过其 get 或 set 方法)都有自己独立初始化的变量副本。ThreadLocal 实例通常是类中的私有静态字段,这些类希望将…...
电脑桌面太单调,用Python写一个桌面小宠物应用。
下面是一个使用Python创建的简单桌面小宠物应用。这个小宠物会在桌面上游荡,可以响应鼠标点击,并且有简单的动画效果。 import tkinter as tk import random import time from PIL import Image, ImageTk import os import sysclass DesktopPet:def __i…...
