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

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

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

相关推荐
Wenweno0o1 天前
0基础Go语言Eino框架智能体实战-chatModel
开发语言·后端·golang
tyung1 天前
一个 main.go 搞定协作白板:你画一笔,全世界都看见
后端·go
咬_咬1 天前
go语言学习(基本数据类型)
开发语言·学习·golang·数据类型
ZHENGZJM1 天前
架构总览:Monorepo 结构与容器化部署
架构·go·react·全栈开发
搜佛说1 天前
01-第1章-概述与快速开始
物联网·golang·开源·软件工程·边缘计算·嵌入式实时数据库
LlNingyu1 天前
什么是Go的接口(二)
golang
不会写DN1 天前
如何设计应用层 ACK 来补充 TCP 的不足?
开发语言·网络·数据库·网络协议·tcp/ip·golang
不会写DN1 天前
如何给 Go 语言的 TCP 聊天服务加上 ACK 可靠送达机制
开发语言·tcp/ip·golang
ZHENGZJM1 天前
后端基石:Go 项目初始化与数据库模型设计
开发语言·数据库·golang
我叫黑大帅1 天前
如何设计应用层 ACK 来补充 TCP 的不足?
后端·面试·go