golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用

Golang轻量级基于角色的访问控制(RBAC)实现插件库gorbac的使用

goRBAC是一个在Golang中实现的轻量级基于角色的访问控制(RBAC)库。

基本概念

在这个包中:

  • 一个身份(identity)可以有一个或多个角色
  • 一个角色(role)请求访问权限
  • 一个权限(permission)被授予给角色

RBAC模型如下:

  • 身份和角色之间是多对多关系
  • 角色和权限之间是多对多关系
  • 角色可以有父角色(继承权限)

安装

使用以下命令安装包:

go get github.com/mikespook/gorbac

使用示例

goRBAC设计用于两个阶段:

  1. 准备阶段
  2. 检查阶段

准备阶段

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实例,可以参考相关文章。

作者

开源许可

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)

性能优化建议

  1. 预加载RBAC规则:在应用启动时加载所有RBAC规则,避免运行时频繁读取
  2. 缓存检查结果:对频繁检查的权限组合进行缓存
  3. 最小化角色继承层级:避免过深的继承层级影响性能

总结

gorbac是一个简单高效的Golang RBAC实现,它具有以下特点:

  • 轻量级且无外部依赖
  • 支持角色继承
  • 提供序列化/反序列化功能
  • 支持自定义匹配逻辑
  • 线程安全

对于大多数中小型应用来说,gorbac提供了足够的功能且性能优异。对于更复杂的权限需求,可以考虑结合业务逻辑进行扩展。

完整文档参考:gorbac GitHub仓库

回到顶部