如何使用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

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

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

相关推荐
Chandler241 小时前
Go:方法
开发语言·c++·golang
小画家~7 小时前
第二十二: go与k8s、docker相关编写dockerfile
开发语言·golang·kubernetes
海风极客10 小时前
Go小技巧&易错点100例(二十五)
开发语言·后端·golang
二狗哈12 小时前
go游戏后端开发34:补杠功能与到时出牌
数据库·游戏·golang
起飞的小鸟12 小时前
Go 中的加锁方式
go
快乐源泉12 小时前
【设计模式】观察者,只旁观?不,还可随之变化
后端·设计模式·go
余瑾瑜12 小时前
宝塔面板安装MySQL数据库并通过内网穿透工具实现公网远程访问
开发语言·后端·golang
Piper蛋窝15 小时前
Go 1.3 相比 Go1.2 有哪些值得注意的改动?
go
顾云澜17 小时前
Apache Superset本地部署结合内网穿透实现无公网IP远程查看数据
开发语言·后端·golang
纪元A梦18 小时前
华为OD机试真题——天然蓄水库(2025A卷:200分)Java/python/JavaScript/C++/C语言/GO六种最佳实现
java·c语言·javascript·c++·python·华为od·go