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

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

本文介绍在非常受欢迎的开源框架——芋道中是如何实现 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.pswp.cn/news/919464.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/919464.shtml
英文地址,请注明出处:http://en.pswp.cn/news/919464.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Docker部署Jellyfin,没有公网IP如何使用内网穿透远程访问?

Jellyfin是一款完全开源、免费的媒体服务器,可帮助你快速搭建属于自己的私人流媒体平台:电影、剧集、音乐、照片统统收纳,跨设备随点随播。本文将以最简洁的步骤,演示如何在Docker容器中部署Jellyfin,并通过贝锐花生壳…

Podman:Mysql(使用卷)

下载镜像hpphcomp:~$ podman pull docker.1ms.run/mysql:latest Trying to pull docker.1ms.run/mysql:latest... Getting image source signatures Copying blob c81e70a25040 done | Copying blob 31f7d8dc4024 done | Copying blob b9916866e45f done | Copying blob …

2025年渗透测试面试题总结-21(题目+回答)

安全领域各种资源,学习文档,以及工具分享、前沿信息分享、POC、EXP分享。不定期分享各种好玩的项目及好用的工具,欢迎关注。 目录 一、文件上传绕过方式(Top 5) 二、文件包含高危函数(PHP为例&#xff0…

像海绵一样吸收技术书籍的高效学习方法

像海绵一样吸收技术书籍的高效学习方法前言六步高效阅读法步骤1:快速浏览章节步骤2:先读章末测验步骤3:只读粗体字步骤4:只读每段的首句和末句步骤5:通读整章步骤6:复习与重复高效学习技术书籍的实用技巧1.…

Day60--图论--94. 城市间货物运输 I(卡码网),95. 城市间货物运输 II(卡码网),96. 城市间货物运输 III(卡码网)

Day60–图论–94. 城市间货物运输 I(卡码网),95. 城市间货物运输 II(卡码网),96. 城市间货物运输 III(卡码网) 今天是Bellman_ford专场。带你从普通的Bellman_ford,到队列…

Jenkins服务器SSH公钥配置步骤

步骤1. 在Jenkins服务器上生成SSH密钥在Jenkins服务器上执行以下命令:# 1. 生成SSH密钥对 ssh-keygen -t rsa -b 4096 -f ~/.ssh/id_rsa -N ""# 2. 设置正确的权限 chmod 700 ~/.ssh chmod 600 ~/.ssh/id_rsa chmod 644 ~/.ssh/id_rsa.pub# 3. 查看公钥内…

数据链路层-网络层-传输层

文章目录深入浅出理解网络核心:从交换机到TCP/UDP一、数据链路层:交换机的"地盘"1. 数据链路层的核心功能2. 以太网的发展历程3. 以太网中的MAC地址4. 以太网帧格式:数据的"快递包装"5. 交换机的工作原理:高效…

专题:2025跨境电商市场布局、供应链与产业带赋能报告 |附130+份报告PDF、原数据表汇总下载

原文链接:https://tecdat.cn/?p43616 2025年,跨境圈的老板们集体焦虑:美国关税飙到145%,亚马逊封号潮卷土重来,而东南亚却悄悄涨了246%!这不是危言耸听——66%的美国消费者说,海外货涨10%就换本…

LINUX 818 shell:random;for for

问题 [rootweb ~]# a$(echo $[$RANDOM%10]) 您在 /var/spool/mail/root 中有邮件 [rootweb ~]# echo $a 3 [rootweb ~]# echo 139$a$a$a$a$a$a$a$a 13933333333 您在 /var/spool/mail/root 中有邮件 [rootweb ~]# echo 139 $a 139 3 [rootweb ~]# echo $a 3 [rootweb ~]# echo …

JavaScript 原型机制详解:从概念到实战(附个人学习方法)

原型是 JavaScript 实现继承与代码复用的核心机制,也是面试高频考点。本文结合个人学习经验、核心概念解析与实战案例,帮你彻底搞懂原型、prototype、__proto__ 及相关知识点,同时分享高效的学习方法。 一、个人学习方法:高效掌握复杂知识点 复杂概念(如原型)的学习,关…

【人工智能】2025年AI代理失控危机:构建安全壁垒,守护智能未来

还在为高昂的AI开发成本发愁?这本书教你如何在个人电脑上引爆DeepSeek的澎湃算力! 在2025年,AI代理(AI Agents)已成为日常生活和企业运营的核心组成部分,它们能够自主决策、执行任务并与环境互动。然而,随着AI代理能力的指数级提升,其安全隐患也日益凸显,包括数据泄露…

从噪声到动作:Diffusion Policy 如何改变机器人学习?

从噪声到动作:Diffusion Policy 如何改变机器人学习? 引言 在机器人手臂操作方面一直存在诸多挑战。我们熟悉的工业场景中的组装机械臂,往往依赖于写死的程序指令进行控制,具有高度规范化与高精度的特点。而当机械臂需要在复杂、…

量子计算和超级计算机将彻底改变技术

我们生活在技术时代,但未来仍有无限可能。近年来,各大企业在量子计算领域持续迈出虽小却关键的步伐 —— 这一技术注定将彻底改变我们所熟知的世界。以下精选的潜在应用场景,将对从交通出行到医疗健康的多个领域产生深远影响。 在由 “1” 和…

Linux 中文显示空白框(Java)

问题展示:解决方案本系统采用宋体,若是其它字体,可以类似排查Font rewardFirstFont new Font("SimSun", Font.BOLD, 20);linux系统字体-检查查询linux系统所有字体fc-list检查是否有目标字体(SimSun)&#…

普通用户使用docker命令

参考大佬 https://blog.51cto.com/u_16175448/12082279 详细步骤及代码 步骤 1:安装 Docker 首先,你需要安装 Docker。 步骤 2:创建 Docker 用户组 Docker 默认以 root 用户运行,为了普通用户能够使用 Docker,我们需要…

【传奇开心果系列】Flet框架实现的家庭记账本示例自定义模板

Flet家庭记账本示例自定义模板一、效果展示截图二、Flet家庭记账本概况介绍三、应用特色1. 简洁直观的用户界面2. 全面的财务管理功能3. 实时数据监控4. 数据可视化分析5. 数据管理功能四、使用场景个人财务管理家庭账务管理小微企业记账学生理财教育五、主要功能模块&#xff…

Node.js 在 Windows Server 上的离线部署方案

Node.js 在 Windows Server 上的离线部署方案 离线部署的核心是提前准备所有依赖资源(避免在线下载),并通过本地配置完成服务搭建,整体分为「依赖准备」「环境配置」「项目部署」「服务注册」4个阶段。 一、提前准备离线资源&am…

SpringAI接入openAI配置出现的问题全解析

SpringAI接入openAI配置出现的四个问题全解析1、无法下载openAI或SpringAI依赖包1.1、思路就是从哪个源下载所需的依赖包1.2、解决思路:我们可以看阿里的中央仓库是否有集成SpringAI的依赖,从它这里下也是可以的。我们看看阿里云云效maven地址&#xff0…

自然语言处理——02 文本预处理(上)

1 认识文本预处理 概念: 文本语料在输送给模型前一般需要一系列的预处理工作,才能符合模型输入的要求;比如:将文本转化成模型需要的张量、规范张量的尺寸;比如: 关于数据X:数据有没有脏数据、数…

数据结构:二叉树的链式存储

用链表来表示一棵二叉树,即用指针指向来指示元素的逻辑关系。通常的方法是链表中每个结点由三个域组成,数据域和左右指针域,左右指针分别用来给出该结点左孩子和右孩子所在的链结点的存储地址 。 我们之前就已经说过,二叉树是递归…