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

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

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

相关推荐
007php00713 小时前
Go语言zero项目部署后启动失败问题分析与解决
java·服务器·网络·python·golang·php·ai编程
桃园码工17 小时前
1-Gin介绍与环境搭建 --[Gin 框架入门精讲与实战案例]
go·gin·环境搭建
云中谷18 小时前
Golang 神器!go-decorator 一行注释搞定装饰器,v0.22版本发布
go·敏捷开发
MClink20 小时前
Go怎么做性能优化工具篇之pprof
开发语言·性能优化·golang
m0_748254661 天前
go官方日志库带色彩格式化
android·开发语言·golang
苏三有春1 天前
五分钟学会如何在GitHub上自动化部署个人博客(hugo框架 + stack主题)
git·go·github
Algorithm15761 天前
云原生相关的 Go 语言工程师技术路线(含博客网址导航)
开发语言·云原生·golang
Narutolxy1 天前
深入探讨 Go 中的高级表单验证与翻译:Gin 与 Validator 的实践之道20241223
开发语言·golang·gin
Hello.Reader1 天前
全面解析 Golang Gin 框架
开发语言·golang·gin
我是前端小学生2 天前
Go语言中的方法和函数
go