casbin+iris实现权限控制

embedded/2025/2/9 6:09:16/

在现代Web应用开发中,权限控制是确保系统安全性和用户体验的关键部分。Casbin 是一个强大的开源访问控制库,支持多种访问控制模型(如RBAC、ABAC等),而Iris则是一个高性能的Go语言Web框架。结合两者,我们可以构建出灵活且高效的权限控制系统。

本文将带你一步步实现一个基于Casbin和Iris的权限控制解决方案,并提供一些最佳实践建议。

一、准备工作

1. 安装依赖

首先,确保你的环境中已经安装了Go语言环境。然后,通过以下命令安装必要的依赖:

go get -u github.com/kataras/iris/v12
go get -u github.com/casbin/casbin/v2
go get -u github.com/casbin/gorm-adapter/v3

2. 初始化项目

创建一个新的Go项目目录,并初始化Go模块:

mkdir iris-casbin-demo
cd iris-casbin-demo
go mod init iris-casbin-demo

二、项目结构

为了保持项目的整洁性,我们采用以下结构:

iris-casbin-demo/
├── main.go
├── model.conf
└── casbin_rule.sql
  • main.go:主程序文件。
  • model.conf:Casbin模型配置文件。
  • casbin_rule.sql:用于初始化Casbin策略的SQL脚本。

三、编写代码

1. 编写 model.conf

model.conf 文件定义了我们的访问控制模型。这里我们使用一个简单的RBAC模型:

[request_definition]
r = sub, obj, act[policy_definition]
p = sub, obj, act[role_definition]
g = _, _[policy_effect]
e = some(where (p.eft == allow))[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act

2. 编写 main.go

接下来,在 main.go 中实现我们的权限控制逻辑:

package mainimport ("fmt""log""github.com/casbin/casbin/v2"gormadapter "github.com/casbin/gorm-adapter/v3"_ "github.com/jinzhu/gorm/dialects/mysql""github.com/kataras/iris/v12"
)func main() {// 初始化数据库连接和Casbin适配器a, err := gormadapter.NewAdapter("mysql", "username:password@tcp(localhost:3306)/casbin_example?charset=utf8mb4&parseTime=True&loc=Local", true)if err != nil {log.Fatalf("NewAdapter failed, err: %v\n", err)}// 加载模型文件并初始化Enforcere, err := casbin.NewEnforcer("model.conf", a)if err != nil {log.Fatalf("NewEnforcer failed, err: %v\n", err)}// 初始化Iris应用app := iris.New()// 定义中间件进行权限检查checkPermission := func(ctx iris.Context) {user := ctx.Values().GetString("user")obj := ctx.Request().URL.Pathact := ctx.Method()if ok, err := e.Enforce(user, obj, act); err != nil || !ok {ctx.StatusCode(iris.StatusForbidden)ctx.WriteString("Forbidden")return}ctx.Next()}// 定义路由和中间件app.Get("/", func(ctx iris.Context) {ctx.WriteString("Welcome to the homepage!")})protected := app.Party("/protected", checkPermission)protected.Get("/resource", func(ctx iris.Context) {ctx.WriteString("This is a protected resource.")})// 启动服务器fmt.Println("Starting server on :8080")app.Run(iris.Addr(":8080"))
}

3. 初始化数据库

创建 casbin_rule.sql 文件来初始化Casbin策略表:

CREATE TABLE IF NOT EXISTS casbin_rule (id INT AUTO_INCREMENT PRIMARY KEY,ptype VARCHAR(100),v0 VARCHAR(100),v1 VARCHAR(100),v2 VARCHAR(100),v3 VARCHAR(100),v4 VARCHAR(100),v5 VARCHAR(100)
);INSERT INTO casbin_rule (ptype, v0, v1, v2) VALUES ('p', 'alice', '/protected/resource', 'GET');
INSERT INTO casbin_rule (ptype, v0, v1) VALUES ('g', 'bob', 'alice');

运行此SQL脚本来初始化数据库:

mysql -u username -p casbin_example < casbin_rule.sql

四、测试权限控制

启动应用:

go run main.go

打开浏览器或使用curl进行测试:

curl -X GET http://localhost:8080/protected/resource -H "user: alice"
# 输出: This is a protected resource.curl -X GET http://localhost:8080/protected/resource -H "user: bob"
# 输出: This is a protected resource.curl -X GET http://localhost:8080/protected/resource -H "user: charlie"
# 输出: Forbidden

五、总结与最佳实践

1. 清晰的权限模型

确保你的权限模型清晰明确,避免过于复杂的规则。这有助于减少错误和提高系统的可维护性。

2. 动态管理策略

利用数据库存储策略,以便可以根据业务需求动态调整权限规则,而无需重新部署应用。

3. 中间件设计

使用中间件进行权限检查,使权限逻辑与业务逻辑分离,增强代码的可读性和可维护性。

4. 日志记录

在权限检查过程中添加适当的日志记录,便于调试和审计。

5. 安全性

确保敏感信息(如数据库凭证)不直接暴露在代码中,使用环境变量或配置文件进行管理。

通过以上步骤,你已经成功搭建了一个基于Casbin和Iris的权限控制系统。希望这篇博客对你有所帮助,祝你在开发过程中一切顺利!


http://www.ppmy.cn/embedded/160735.html

相关文章

(篇三)基于PyDracula搭建一个深度学习的软件之解析yolo算法融合

文章目录 1YoloPredictor类——检测器1.1继承BasePredictor解析1.2继承QObject解析 2MainWindow类——主窗口 在前面两篇中&#xff0c;篇一介绍了启动界面的制作&#xff0c;篇二介绍了如何修改PyDracula的界面&#xff0c;那么这一篇我们学习一下yolo要融合进入软件中&#x…

Centos Stream 10 根目录下的文件夹结构

/ ├── bin -> usr/bin ├── boot ├── dev ├── etc ├── home ├── lib -> usr/lib ├── lib64 -> usr/lib64 ├── lostfound ├── media ├── mnt ├── opt ├── proc ├── root ├── run ├── sbin -> usr/sbin ├── srv ├─…

R包:ggalign调整和组合多个图形的R包

文章目录 介绍案例安装R包教程1教程2参考 介绍 这个包扩展了ggplot2&#xff0c;提供了用于对齐和组织多个图的高级工具&#xff0c;特别是那些自动重新排序观察结果的工具&#xff0c;比如树形图。它提供了对布局调整和情节注释的精细控制&#xff0c;使您能够创建复杂的、出…

Maven插件—flatten-maven-plugin:工程模块统一版本依赖

文章目录 前言一、认识flatten-maven-plugin插件二、如何使用flatten-maven-plugin插件&#xff1f;未使用flatten-maven-plugin插件之前的情况描述配置flatten-maven-plugin插件步骤1&#xff1a;最外层父模块安装插件&配置版本变量步骤2&#xff1a;各个自模块使用版本使…

2025年02月05日Github流行趋势

项目名称&#xff1a;OCRmyPDF 项目地址url&#xff1a;https://github.com/ocrmypdf/OCRmyPDF项目语言&#xff1a;Python历史star数&#xff1a;15872今日star数&#xff1a;157项目维护者&#xff1a;jbarlow83, fritz-hh, apps/dependabot, mawi12345, mara004项目简介&…

学习笔记十九:K8S生成pod过程

K8S生成pod过程 流程图具体生成过程用户提交 Pod 定义API Server 处理请求调度器分配节点&#xff08;Scheduling&#xff09;目标节点上的 Pod 创建网络配置状态上报与监控控制器管理&#xff08;Controller Manager&#xff09;就绪与服务发现 关键错误场景高级特性 流程图 具…

RocketMQ面试题:原理部分

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;精通Java编…

[每周一更]-(第133期):Go中MapReduce架构思想的使用场景

文章目录 **MapReduce 工作流程**Go 中使用 MapReduce 的实现方式&#xff1a;**Go MapReduce 的特点****哪些场景适合使用 MapReduce&#xff1f;**使用场景1. 数据聚合2. 数据过滤3. 数据排序4. 数据转换5. 数据去重6. 数据分组7. 数据统计8.**统计文本中单词出现次数****代码…