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

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

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

相关推荐
杨若瑜1 小时前
Go语言24小时极速学习教程(五)Go语言中的SpringMVC框架——Gin
学习·golang·gin
0x派大星3 小时前
【Goland】——Gin 框架中间件详解:从基础到实战
开发语言·后端·中间件·golang·go·gin
0x派大星3 小时前
【Goland】——Gin 框架简介与安装
后端·golang·go·gin
Thomas_Cai5 小时前
用go语言后端开发速查
开发语言·golang·后端开发
拧螺丝专业户14 小时前
gin源码阅读(1)URL中的参数是如何解析的?
golang·gin
hlsd#17 小时前
go 集成swagger 在线接口文档
开发语言·后端·golang
凡人的AI工具箱20 小时前
15分钟学 Go 第 54 天 :项目总结与经验分享
开发语言·人工智能·后端·算法·golang
景天科技苑1 天前
【云原生开发】k8s后台管理系统开发接口优化方案
云原生·golang·k8s二次开发·云原生开发·接口优化
王大锤43911 天前
GOLANG+VUE后台管理系统
golang