casbin+iris实现权限控制

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

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

一、准备工作

1. 安装依赖

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

bash 复制代码
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 中实现我们的权限控制逻辑:

Go 复制代码
package main

import (
	"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)
	}

	// 加载模型文件并初始化Enforcer
	e, 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.Path
		act := 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策略表:

sql 复制代码
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脚本来初始化数据库:

bash 复制代码
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的权限控制系统。希望这篇博客对你有所帮助,祝你在开发过程中一切顺利!

相关推荐
Amd79410 天前
数据库安全管理中的用户和角色管理:打造安全高效的数据环境
用户管理·身份认证·数据库安全·权限控制·角色管理·数据库管理系统·安全最佳实践
问道飞鱼17 天前
【前端知识】简单易懂的vue前端页面元素权限控制
前端·javascript·vue.js·权限控制
yaoxin52112318 天前
第三章 C 开头的术语
sql·iris
咩咩大主教19 天前
Go语言通过Casbin配合MySQL和Gorm实现RBAC访问控制模型
mysql·golang·鉴权·go语言·rbac·abac·casbin
安 当 加 密21 天前
通过Ukey或者OTP动态口令实现windows安全登录
身份认证·权限控制·远程桌面登录·双因素认证·操作系统登录双因素认证·ukey·otp动态口令
非凡的世界2 个月前
Go web 开发框架 Iris
开发语言·golang·iris
三里清风_3 个月前
如何使用Casbin设计后台权限管理系统
golang·go·casbin
三里清风_4 个月前
Casbin是什么?
golang·casbin
yaoxin5211231 年前
第四章 使用 SQL Search - SQL search_items 语法
开发语言·数据库·sql·c#·cache·iris·m