golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用
Golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用
goRBAC是一个在Golang中实现的轻量级基于角色的访问控制(RBAC)库。
基本概念
在这个包中:
- 一个身份(identity)可以有一个或多个角色
- 一个角色(role)请求访问权限
- 一个权限(permission)被授予给角色
RBAC模型如下:
- 身份和角色之间是多对多关系
- 角色和权限之间是多对多关系
- 角色可以有父角色(继承权限)
安装
使用以下命令安装包:
go get github.com/mikespook/gorbac
使用示例
goRBAC设计用于两个阶段:
- 准备阶段
- 检查阶段
准备阶段
package main
import (
"fmt"
"github.com/mikespook/gorbac"
)
func main() {
// 获取RBAC实例
rbac := gorbac.New()
// 创建角色
rA := gorbac.NewRole("role-a")
rB := gorbac.NewRole("role-b")
rC := gorbac.NewRole("role-c")
rD := gorbac.NewRole("role-d")
rE := gorbac.NewRole("role-e")
// 创建权限
pA := gorbac.NewPermission("permission-a")
pB := gorbac.NewPermission("permission-b")
pC := gorbac.NewPermission("permission-c")
pD := gorbac.NewPermission("permission-d")
pE := gorbac.NewPermission("permission-e")
// 将权限分配给角色
rA.Assign(pA)
rB.Assign(pB)
rC.Assign(pC)
rD.Assign(pD)
rE.Assign(pE)
// 将角色添加到RBAC实例
rbac.Add(rA)
rbac.Add(rB)
rbac.Add(rC)
rbac.Add(rD)
rbac.Add(rE)
// 设置继承关系
rbac.SetParent("role-a", "role-b") // role-a继承role-b
rbac.SetParents("role-b", []string{"role-c", "role-d"}) // role-b继承role-c和role-d
rbac.SetParent("role-e", "role-d") // role-e继承role-d
}
检查阶段
// 检查权限
if rbac.IsGranted("role-a", pA, nil) &&
rbac.IsGranted("role-a", pB, nil) &&
rbac.IsGranted("role-a", pC, nil) &&
rbac.IsGranted("role-a", pD, nil) {
fmt.Println("The role-a has been granted permis-a, b, c and d.")
}
// 检查循环继承
rbac.SetParent("role-c", "role-a")
if err := gorbac.InherCircle(rbac); err != nil {
fmt.Println("A circle inheritance occurred.")
}
内置工具函数
goRBAC提供了一些内置的工具函数:
InherCircle
: 检查是否有循环继承AnyGranted
: 检查是否有任何权限被授予AllGranted
: 检查是否所有权限都被授予
持久化
关于如何持久化goRBAC实例,可以参考相关文章。
作者
- Xing Xing (mikespook@gmail.com)
开源许可
goRBAC使用MIT软件许可证,详情见LICENSE文件。
这个库非常适合需要在Golang应用中实现简单RBAC功能的场景,通过角色和权限的管理,可以轻松控制用户的访问权限。
更多关于golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用的实战教程也可以访问 https://www.itying.com/category-94-b0.html
1 回复
更多关于golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html
Golang轻量级RBAC实现:gorbac使用指南
RBAC(基于角色的访问控制)是管理用户权限的常用模型。在Golang生态中,gorbac是一个轻量级的RBAC实现库,它简单易用且功能完备。
gorbac核心概念
gorbac包含三个核心概念:
- 角色(Role):权限的集合
- 权限(Permission):系统操作的最小单元
- 继承(Inheritance):角色间的层级关系
安装gorbac
go get github.com/mikespook/gorbac
基本使用示例
1. 创建权限和角色
package main
import (
"fmt"
"github.com/mikespook/gorbac"
)
func main() {
// 创建RBAC实例
rbac := gorbac.New()
// 创建权限
permRead := gorbac.NewPermission("read")
permWrite := gorbac.NewPermission("write")
permDelete := gorbac.NewPermission("delete")
// 创建角色并分配权限
roleUser := gorbac.NewRole("user")
roleUser.Assign(permRead)
roleEditor := gorbac.NewRole("editor")
roleEditor.Assign(permRead, permWrite)
roleAdmin := gorbac.NewRole("admin")
roleAdmin.Assign(permRead, permWrite, permDelete)
// 设置角色继承
roleAdmin.AddParent("editor")
roleEditor.AddParent("user")
// 将角色添加到RBAC实例
rbac.Add(roleUser)
rbac.Add(roleEditor)
rbac.Add(roleAdmin)
// 检查权限
userRoles := []string{"user"}
fmt.Println("User can read:", rbac.IsGranted("user", permRead, nil)) // true
fmt.Println("User can write:", rbac.IsGranted("user", permWrite, nil)) // false
adminRoles := []string{"admin"}
fmt.Println("Admin can delete:", rbac.IsGranted("admin", permDelete, nil)) // true
}
2. 持久化存储
gorbac支持将RBAC结构保存为JSON并恢复:
// 保存RBAC状态
data, err := gorbac.Export(rbac)
if err != nil {
panic(err)
}
// 从JSON恢复RBAC
newRbac, err := gorbac.Import(data)
if err != nil {
panic(err)
}
3. 自定义匹配函数
// 创建自定义匹配函数
customMatcher := func(roleID string, perm gorbac.Permission) bool {
// 实现自定义逻辑
return true
}
// 使用自定义匹配器检查权限
rbac.IsGranted("admin", permDelete, customMatcher)
实际应用示例
Web中间件实现
func RBACMiddleware(requiredPerm string, rbac *gorbac.RBAC) gin.HandlerFunc {
return func(c *gin.Context) {
// 从上下文中获取用户角色
userRoles := c.GetStringSlice("roles")
// 检查权限
perm := gorbac.NewPermission(requiredPerm)
granted := false
for _, role := range userRoles {
if rbac.IsGranted(role, perm, nil) {
granted = true
break
}
}
if !granted {
c.AbortWithStatusJSON(403, gin.H{"error": "Forbidden"})
return
}
c.Next()
}
}
// 使用示例
// router.GET("/admin", RBACMiddleware("delete", rbac), adminHandler)
性能优化建议
- 预加载RBAC规则:在应用启动时加载所有RBAC规则,避免运行时频繁读取
- 缓存检查结果:对频繁检查的权限组合进行缓存
- 最小化角色继承层级:避免过深的继承层级影响性能
总结
gorbac是一个简单高效的Golang RBAC实现,它具有以下特点:
- 轻量级且无外部依赖
- 支持角色继承
- 提供序列化/反序列化功能
- 支持自定义匹配逻辑
- 线程安全
对于大多数中小型应用来说,gorbac提供了足够的功能且性能优异。对于更复杂的权限需求,可以考虑结合业务逻辑进行扩展。
完整文档参考:gorbac GitHub仓库