当前位置: 首页 > news >正文

芋道RBAC实现介绍

说明:之前写过一篇博客,介绍如何搭建一个基于角色的权限验证框架

  • 搭建一个基于角色的权限验证框架

本文介绍在非常受欢迎的开源框架——芋道中是如何实现 RBAC 的,芋道的部署参考下面这篇文章:

  • 芋道微服务代码部署

介绍

一般来说,系统内用户权限分以下两类,RBAC(基于角色的权限验证)对应的是第一类。

  • 菜单权限:用户能看到那些菜单,与用户所拥有的角色挂钩;

  • 数据权限:用户能看到那些数据,与用户所处的部门挂钩;

(1)数据库表设计

五张表,三张实体表,两张映射表。通过给角色赋予菜单,用户赋予角色来控制用户所能访问的菜单,RBAC 的基础操作

在这里插入图片描述

(2)接口设计

用户赋予角色,角色赋予权限接口

在这里插入图片描述

实际上就是往两张映射表里写数据

在这里插入图片描述

(3)接口校验

用户仅能看到所拥有角色权限内的菜单,需要前端和后端共同实现,前端仅展示当前用户能看到的菜单(包括按钮),后端需要给每个接口设置权限标识,没有权限的用户访问接口会被拦截。

看芋道是怎么实现的?下面这个接口返回了当前用户权限信息,包括了用户信息、角色信息和菜单权限信息

在这里插入图片描述

前端通过返回的数据,展示对应的菜单和按钮。另外,在管理员或者拥有修改某角色权限的用户修改角色的菜单权限时,保证对应角色用户的权限能实时生效,前端可以控制调用该接口的时机。

也就是什么时候调用该接口?是登录时调用一次,还是进入菜单,展示内容前先调用查一遍?这决定了角色权限生效的时效。

在这里插入图片描述

在后端,需要给每个按钮对应访问的接口设置权限标识,并在用户访问时判断当前用户是否拥有该权限。如下,

在这里插入图片描述

点进去,查看实现,也还是通过当前用户 ID + 权限标识判断

在这里插入图片描述

hasAnyPermissionsCache 是用户 ID 对应权限的 Map 集合,使用了本地缓存,过期时间 1 分钟

在这里插入图片描述

查看数据来源,也就是用用户 ID 去查了数据库,获取当前用户的所有角色

在这里插入图片描述

查出角色后再查角色所拥有的权限,挨个与当前传入的权限标识比较,看在不在这里面

在这里插入图片描述

(4)设置当前用户

这里,在校验 token 的拦截器中,将当前用户信息设置到上线文中

在这里插入图片描述

这里放了 用户 ID 和用户 Type,如果你需要用到用户的其他信息,如 用户名、性别等,也可以在这里加

在这里插入图片描述

扩展

这里演示新增一个接口,加入到 RBAC 校验体系中。

(1)新增按钮

在系统设置中,新增一个按钮,这里可以选按钮所在的上级菜单,及该按钮在哪个页面里,再设置一个权限标识,这个标识前端用于判断是否展示按钮,后端用于校验用户是否拥有访问权限,所以前后端要约定好。

在这里插入图片描述

(2)开发接口

接着,后端程序员就去开发自己的接口,开发完后,在接口上加上这行校验注解

在这里插入图片描述

(3)测试

创建一个角色,将该权限不赋予给这个角色

在这里插入图片描述

再将这个角色赋予给某个用户

在这里插入图片描述

设置完,前端应该不会给这个用户展示这个按钮,使用 apifox 用该用户的 token 调用该接口,提示没有操作权限

在这里插入图片描述

总结

本文介绍了在芋道框架中 RBAC 实现的细节

http://www.dtcms.com/a/336269.html

相关文章:

  • python+flask后端开发~项目实战 | 博客问答项目--模块化文件架构的基础搭建
  • Valgrind 并发调试 ·:用 Helgrind 抓住线程里的“看不见的错”
  • 数据结构:在二叉搜索树中插入元素(Insert in a BST)
  • linux-高级IO(上)
  • 猫头虎AI分享|一款Coze、Dify类开源AI应用超级智能体Agent快速构建工具:FastbuildAI
  • #买硬盘欲安装k8s记
  • Flutter 3.35 更新要点解析
  • ICCV 2025 | Reverse Convolution and Its Applications to Image Restoration
  • 如何运用好DeepSeek为自己服务:智能增强的范式革命 1.2 DeepSeek认知增强模型
  • 计算机基础速通--数据结构·图的基础应用三(基础图算法进阶)
  • Tauri 框架介绍
  • 《Nursing Research》(护理SCI)LaTeX模板详细教程:从入门到投稿(一)
  • 炒股术语:“洗盘”
  • LLM入门学习
  • 【165页PPT】锂电池行业SAP解决方案(附下载方式)
  • 【C++】Windows 下 TCP接口超详介绍,如何实现一个TCP服务端和客户端
  • 又一家茑屋书店即将歇业,精品书店的未来在哪里?
  • ruoyi-vue(十一)——代码生成
  • Python爬虫实战:研究optimesh库,构建Github网格数据采集系统
  • AntSK-PyAPI技术深度解析:打造企业级文本嵌入向量服务的完整指南
  • C语言(12)——进阶函数
  • 【Linux】文件基础IO
  • 软件需求High-Level(高层级)需求和Low-Level(低层级)需求
  • rt-thread audio框架移植stm32 adc+dac,用wavplayer录音和播放
  • 测试Windows10IoT系统是否可以正常运行KingSCSDA3.8软件
  • python的软件工程与项目管理课程组学习系统
  • 算法第四十八天:单调栈part01(第十章)
  • C++ 力扣 904.水果成篮 题解 优选算法 滑动窗口 每日一题
  • 算法03 归并分治
  • 最优化:建模、算法与理论|02 Optimization Modeling and Typical Examples(1)