Go 每日一库:casbin 库,权限管理的灵活实现
【免费下载链接】go-daily-lib Go 每日一库 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib
你是否还在为项目中的权限管理模块头疼?复杂的角色关系、多变的访问规则、不同场景下的权限策略,这些问题往往让开发者耗费大量精力。今天我们要介绍的 casbin 库,将为你提供一套灵活且强大的权限管理解决方案,让你轻松应对各种权限场景。读完本文,你将了解 casbin 的核心概念、基本使用方法以及常见权限模型的实现,帮助你在项目中快速集成权限管理功能。
casbin 库简介
casbin 是一个强大的、高效的开源访问控制框架,它支持多种访问控制模型,如基于角色的访问控制(RBAC)、基于属性的访问控制(ABAC)等。casbin 的核心思想是将访问控制逻辑与业务逻辑分离,通过配置文件来定义权限规则,从而实现权限的灵活管理和动态调整。
casbin 库的主要特点包括:
- 支持多种访问控制模型,满足不同场景的需求
- 基于配置文件定义权限规则,便于维护和扩展
- 提供丰富的 API,易于集成到各种应用中
- 支持自定义函数,实现复杂的权限判断逻辑
在本项目中,casbin 相关的代码和示例可以在 casbin/ 目录下找到。
快速开始
让我们从一个简单的示例开始,了解 casbin 的基本使用方法。
环境准备
首先,需要确保你的项目中已经引入了 casbin 库。你可以通过以下命令安装:
go get github.com/casbin/casbin/v2
基本示例
在 casbin/get-started/ 目录下,我们提供了一个 casbin 的快速入门示例。
首先,我们需要定义一个模型配置文件 model.conf:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[matchers]
m = r.sub == p.sub && r.obj == p.obj && r.act == p.act
[policy_effect]
e = some(where (p.eft == allow))
这个模型定义了请求(request)、策略(policy)、匹配器(matchers)和策略效果(policy effect)四个部分。
然后,我们需要定义一个策略文件 policy.csv:
p, dajun, data1, read
p, lizi, data2, write
这个策略文件定义了两条权限规则:用户 dajun 可以读取 data1,用户 lizi 可以写入 data2。
最后,我们编写代码 main.go 来使用 casbin 进行权限检查:
package main
import (
"fmt"
"log"
"github.com/casbin/casbin/v2"
)
func check(e *casbin.Enforcer, sub, obj, act string) {
ok, _ := e.Enforce(sub, obj, act)
if ok {
fmt.Printf("%s CAN %s %s\n", sub, act, obj)
} else {
fmt.Printf("%s CANNOT %s %s\n", sub, act, obj)
}
}
func main() {
e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
if err != nil {
log.Fatalf("NewEnforecer failed:%v\n", err)
}
check(e, "dajun", "data1", "read")
check(e, "lizi", "data2", "write")
check(e, "dajun", "data1", "write")
check(e, "dajun", "data2", "read")
}
运行这段代码,输出结果如下:
dajun CAN read data1
lizi CAN write data2
dajun CANNOT write data1
dajun CANNOT read data2
从输出结果可以看出,casbin 正确地执行了我们定义的权限规则。
常见权限模型
casbin 支持多种常见的权限模型,下面我们将介绍几种主要的模型及其实现。
RBAC 模型
基于角色的访问控制(RBAC)是一种常见的权限管理模型,它将权限分配给角色,用户通过拥有角色来获得相应的权限。
在 casbin/rbac/ 目录下,我们提供了 RBAC 模型的多个示例,包括基本 RBAC、RBAC 层级结构、RBAC 域等。
基本 RBAC
基本 RBAC 模型的示例代码可以在 casbin/rbac/base/ 目录下找到。
模型配置文件 model.conf 定义了角色和权限的关系:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
g = _, _
[role_definition]
g = _, _
[matchers]
m = g(r.sub, p.sub) && r.obj == p.obj && r.act == p.act
[policy_effect]
e = some(where (p.eft == allow))
策略文件 policy.csv 定义了用户、角色和权限的关系:
p, admin, data, read
p, admin, data, write
p, user, data, read
g, dajun, admin
g, lizi, user
在这个示例中,admin 角色拥有 data 的读写权限,user 角色拥有 data 的读权限。dajun 是 admin 角色,lizi 是 user 角色。
RBAC 层级结构
RBAC 层级结构允许角色之间存在继承关系,子角色可以继承父角色的权限。示例代码可以在 casbin/rbac/hierarchy/ 目录下找到。
ABAC 模型
基于属性的访问控制(ABAC)是一种更加灵活的权限模型,它根据主体、客体的属性以及环境信息来判断权限。
在 casbin/abac/ 目录下,我们提供了 ABAC 模型的示例。
模型配置文件 model.conf 定义了基于属性的匹配规则:
[request_definition]
r = sub, obj, act
[policy_definition]
p = sub, obj, act
[matchers]
m = r.sub.Owner == r.obj.Name || r.sub.Hour >= 9 && r.sub.Hour <= 18
[policy_effect]
e = some(where (p.eft == allow))
在这个示例中,我们定义了两个匹配条件:要么主体是客体的所有者,要么访问时间在 9 点到 18 点之间。
示例代码 main.go 演示了如何使用 ABAC 模型进行权限检查:
package main
import (
"fmt"
"log"
"github.com/casbin/casbin/v2"
)
type Object struct {
Name string
Owner string
}
type Subject struct {
Name string
Hour int
}
func check(e *casbin.Enforcer, sub Subject, obj Object, act string) {
ok, _ := e.Enforce(sub, obj, act)
if ok {
fmt.Printf("%s CAN %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
} else {
fmt.Printf("%s CANNOT %s %s at %d:00\n", sub.Name, act, obj.Name, sub.Hour)
}
}
func main() {
e, err := casbin.NewEnforcer("./model.conf", "./policy.csv")
if err != nil {
log.Fatalf("NewEnforecer failed:%v\n", err)
}
o := Object{"data", "dajun"}
s1 := Subject{"dajun", 10}
check(e, s1, o, "read")
s2 := Subject{"lizi", 10}
check(e, s2, o, "read")
s3 := Subject{"dajun", 20}
check(e, s3, o, "read")
s4 := Subject{"lizi", 20}
check(e, s4, o, "read")
}
自定义函数
casbin 允许我们定义自定义函数,以实现更复杂的权限判断逻辑。在 casbin/function/ 目录下,我们提供了自定义函数的示例。
内置函数
casbin 已经内置了一些常用的函数,例如 keyMatch、ipMatch 等。示例代码可以在 casbin/function/built-in/ 目录下找到。
自定义函数
我们也可以定义自己的函数来扩展 casbin 的功能。示例代码可以在 casbin/function/self-defined/ 目录下找到。
在这个示例中,我们定义了一个自定义函数 isEven,用于判断用户 ID 是否为偶数:
func isEven(args ...interface{}) (interface{}, error) {
id := args[0].(int)
return id%2 == 0, nil
}
然后在模型配置文件中使用这个函数:
[matchers]
m = isEven(r.sub)
总结
casbin 是一个功能强大、灵活易用的权限管理库,它支持多种访问控制模型,能够满足不同场景下的权限管理需求。通过本文的介绍,我们了解了 casbin 的基本概念、快速入门方法以及常见权限模型的实现。
在实际项目中,你可以根据自己的需求选择合适的权限模型,并通过自定义函数等方式扩展 casbin 的功能。希望 casbin 能够帮助你更好地管理项目中的权限问题。
如果你对 casbin 还有更多的疑问或者想要深入学习,可以参考 casbin 的官方文档,或者查看本项目中 casbin/ 目录下的更多示例代码。
最后,如果你觉得本文对你有帮助,欢迎点赞、收藏、关注,我们下期再见!
【免费下载链接】go-daily-lib Go 每日一库 项目地址: https://gitcode.com/GitHub_Trending/go/go-daily-lib
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



