如何使用Casbin设计后台权限管理系统

为什么要加权限设计?

后台管理系统中的权限系统设计是为了确保安全性、数据保护和合规性,同时提供灵活性、责任追踪、角色管理、审计监控和提高工作效率。它通过控制用户对数据和功能的访问,帮助企业防止未授权访问和数据泄露,同时提升用户体验和业务效率。

相关概念

用户

用户是指系统的登录用户,可以理解为一系列的人员,例如张三、李四、王五三人

角色

可以理解为功能权限的集合,是系统赋予用户的头衔,例如:系统管理员,普通用户等

权限

可以理解为一个权限控制的单元,例如:system.user.manger 系统级用户管理,具备该权限的用户,可以管理系统级用户

权限模型

什么是权限模型

权限模型是指用于描述用户、角色和权限之间关系的一种抽象模型。不同的权限模型有不同的优缺点,适用于不同的场景和需求。在这里我们主要介绍RBAC(Role-Based Access Control)模型,即基于角色的访问控制模型。

RBAC 模型的基本思想是将用户和权限分离,通过角色作为中间层来连接用户和权限。一个角色可以关联多个权限,一个用户可以拥有多个角色。这样可以实现灵活的权限配置和管理,避免直接给用户分配权限带来的复杂性和冗余性。

传统权限模型

传统的权限模型就是为用户分配菜单权限,例如张三看到A、B、C菜单,李四看到B、C菜单,王五看到A、B、C菜单,这种传统的权限模型简单粗暴,直接为用户分配菜单即可。

但是随着公司员工激增,每一个员工都要分配一次,显然效率太低;并且,在进行交互设计时,定义数百名用户拥有的菜单权限,那需要写数百行的表格。

RBAC权限模型

RBAC,即基于角色的访问控制(Role-Based Access Control),是优秀的权限控制模型,主要通过角色和权限建立管理,再赋予用户不同的角色,来实现权限控制的目标。

利用该模型来配置权限,直接优点是角色的数量比用户的数量更少,先把权限赋予角色,即可完成权限的分配;再为用户分配相应的角色,即可直接获得角色拥有的权限。

但是需要注意的是,用户------角色------权限之间并非是一对一的对应关系,一个用户可以拥有多种角色,一个角色也可以拥有多个权限,所以应该是多对多的关系

根据权限动态显示菜单

有了用户------角色------权限的定义,那么我们可不可以通过给用户分配的权限来给他显示不同的菜单呢?

要实现这个效果,首先我们需要明白的是,是否显示菜单取决于用户是否拥有展示这个菜单的权限,这与角色并没有什么关系

权限管理分三个部分:

  • 接口的访问权限:
    • 这个需要后端来完成,前端只需要配置。
  • 菜单的访问权限,展示给特定用户的菜单是哪样的
    • 这个需要前端设置,后台再返给你过滤后的菜单。

实现思路

参考链接: casbin官方文档,根据文档中给出的定义格式,可以将角色和权限直接定义出来

go 复制代码
p, basic:ROLE_SYSTEM_ADMIN, system.tenant.view
p, basic:ROLE_SYSTEM_ADMIN, system.tenant.create
p, basic:ROLE_SYSTEM_ADMIN, system.tenant.update
p, basic:ROLE_SYSTEM_ADMIN, system.tenant.delete
p, basic:ROLE_SYSTEM_ADMIN, system.tenant.lock
p, basic:ROLE_SYSTEM_ADMIN, system.user.view
p, basic:ROLE_SYSTEM_ADMIN, system.user.create
p, basic:ROLE_SYSTEM_ADMIN, system.user.update
p, basic:ROLE_SYSTEM_ADMIN, system.user.delete
p, basic:ROLE_SYSTEM_ADMIN, system.user.password.reset
p, basic:ROLE_SYSTEM_ADMIN, system.user.lock
p, basic:ROLE_SYSTEM_ADMIN, system.user.tenant.grant
p, basic:ROLE_SYSTEM_ADMIN, system.license.update
p, basic:ROLE_SYSTEM_ADMIN, system.dashboard.view
p, basic:ROLE_SYSTEM_ADMIN, system.conversation.view
p, basic:ROLE_SYSTEM_ADMIN, system.conversation.export
p, basic:ROLE_SYSTEM_ADMIN, system.aiapp.publish

之后根据登录用户的角色查找用户拥有的权限返回给前端

前端定义菜单树,大致结构为:菜单名称、展示该菜单需要拥有的权限、是否有子菜单等,根据后端传回的用户权限,来遍历菜单树确定某菜单是否应该展示

相关推荐
QX_hao40 分钟前
【Go】--扩容机制
开发语言·golang
xurime3 小时前
Excelize 开源基础库发布 2.10.0 版本更新
golang·开源·github·excel·ai编程·go语言
幼稚园的山代王11 小时前
go语言了解
开发语言·后端·golang
zhuyasen11 小时前
踩坑实录:Go 1.25.x 编译的 exe 在 Windows 提示“此应用无法运行”
windows·golang
光头闪亮亮19 小时前
ZBar 条码/二维码识别工具介绍及golang通过cmd调用ZBar从图片中批量识别二维码
go
东风t西瓜21 小时前
golang项目开发环境配置
go
CoLiuRs1 天前
异步任务使用场景与实践
微服务·性能优化·golang
poemyang2 天前
Goroutine间的“灵魂管道”:Channel如何实现数据同步与因果传递?
golang·并发编程
Lazy龙2 天前
Golang协程
golang
zhuyasen2 天前
在某些 Windows 版本,Go 1.25.x 编译出来的 exe 运行报错:此应用无法在你的电脑上运行
windows·go·编译器