手把手带你开发一套用户权限系统,精确到按钮级

在实际的软件项目开发过程中,用户权限控制可以说是所有运营系统中必不可少的一个重点功能,根据业务的复杂度,设计的时候可深可浅,但无论怎么变化,设计的思路基本都是围绕着用户、角色、菜单这三个部分展开

如何设计一套可以精确到按钮级别的用户权限功能呢?

今天通过这篇文章一起来了解一下相关的实现逻辑,不多说了,直接上案例代码!

01、数据库设计

在进入项目开发之前,首先我们需要进行相关的数据库设计,以便能存储相关的业务数据。

对于【用户权限控制】功能,通常5张表基本就可以搞定,分别是:用户表、角色表、用户角色表、菜单表、角色菜单表,相关表结构示例如下。

其中,用户和角色是多对多的关系角色与菜单也是多对多的关系用户通过角色来关联到菜单,当然也有的用户权限控制模型中,直接通过用户关联到菜单,实现用户对某个菜单权限独有控制,这都不是问题,可以自由灵活扩展。

用户、角色表的结构设计,比较简单。下面,我们重点来解读一下菜单表的设计,如下:

可以看到,整个菜单表就是一个父子表结构,关键字段如下

  • name:菜单名称
  • menu_code:菜单编码,用于后端权限控制
  • parent_id:菜单父节点ID,方便递归遍历菜单
  • node_type:菜单节点类型,可以是文件夹、页面或者按钮类型
  • link_url:菜单对应的地址,如果是文件夹或者按钮类型,可以为空
  • level:菜单树的层次,以便于查询指定层级的菜单
  • path:树id的路径,主要用于存放从根节点到当前树的父节点的路径,想要找父节点时会特别快

为了方便项目后续开发,在此我们创建一个名为menu_auth_db的数据库,SQL 初始脚本如下:

02、项目构建

菜单权限模块的数据库设计搞定之后,就可以正式进入系统开发阶段了。

2.1、创建项目

为了快速构建项目,这里采用的是springboot+mybatisPlus框架来快速开发,借助mybatisPlus提供的生成代码器,可以一键生成所需的daoserviceweb层的服务代码,以便帮助我们剩去 CRUD 中重复编程的工作量,内容如下:

CRUD 代码生成完成之后,此时我们就可以编写业务逻辑代码了,相关示例如下!

2.2、菜单功能开发
2.2.1、菜单新增逻辑示例

2.2.2、菜单查询逻辑示例

这里需要用到递归算法来封装菜单视图。

为了便于演示,这里我们先在数据库中初始化几条数据,最后三条数据指的是按钮类型的菜单,用户真正请求的时候,实际上请求的是这三个功能,内容如下:

queryMenuTree接口发起请求,返回的数据结果如下图:

将返回的数据,通过页面进行渲染之后,结果类似如下图:

2.3、用户权限开发

在上文,我们提到了用户通过角色来关联菜单,因此,很容易想到,用户控制菜单的流程如下:

  • 第一步:用户登陆系统之后,查询当前用户拥有哪些角色;
  • 第二步:再通过角色查询关联的菜单权限点;
  • 第三步:最后将用户拥有的角色名下所有的菜单权限点,封装起来返回给用户;

带着这个思路,我们一起来看看具体的实现过程。

2.3.1、用户权限点查询逻辑示例

2.4、用户鉴权开发

完成以上的逻辑开发之后,可以实现哪些用户拥有哪些菜单权限点的操作,比如用户【张三】,拥有【用户管理】菜单,那么他只能看到【用户管理】的界面;用户【李四】,用于【角色管理】菜单,同样的,他只能看到【角色管理】的界面,无法看到其他的界面。

但是某些技术人员发生漏洞之后,可能会绕过页面展示逻辑,直接对接口服务发起请求,依然能正常操作,例如利用用户【张三】的账户,操作【角色管理】的数据,这个时候就会发生数据安全隐患的问题。

为此,我们还需要一套用户鉴权的功能,对接口请求进行验证,只有满足要求的才能获取数据。

其中上文提到的菜单编码menuCode就是一个前、后端联系的桥梁。其实所有后端的接口,与前端对应的都是按钮操作,因此我们可以以按钮为基准,实现前后端双向权限控制

以【角色管理-查询】这个为例,前端可以通过菜单编码实现是否展示这个查询按钮,后端可以通过菜单编码来鉴权当前用户是否具备请求接口的权限,实现过程如下!

2.4.1、权限控制逻辑示例

在此,我们采用权限注解+代理拦截器的方式,来实现接口权限的安全验证。

2.4.2、鉴权逻辑验证

我们以上文说到的【角色管理-查询】为例,编写一个服务接口来验证一下逻辑的正确性。

首先,编写一个请求实体类RoleDTO,添加userId属性

其次,编写一个角色查询接口,并在方法上添加@CheckPermissions注解,表示此方法需要鉴权,满足条件的用户才能请求通过。

最后,在数据库中初始化相关的数据。例如给用户【张三】分配一个【访客人员】角色,同时这个角色只有【系统配置】、【用户管理】菜单权限。

启动项目,在postman中传入用户【张三】的ID,查询用户具备的菜单权限,只有两个,结果如下:

同时,利用用户【张三】发起【角色管理-查询】操作,提示:接口无访问权限,结果如下:

与预期结果一致!因为没有配置角色查询接口,所以无权访问!

03、小结

最后总结一下,【用户权限控制】功能在实际的软件系统中非常常见,希望本篇的知识能帮助到大家。

此外,想要获取项目源代码的小伙伴,可以关注下方公众号并回复:用户权限控制,即可获取取项目的源代码。

04、写到最后

不会有人刷到这里还想白嫖吧?点赞对我真的非常重要!在线求赞。加个关注我会非常感激!

此外,本文已整理到技术笔记中,笔记内容还涵盖 Spring、Spring Boot/Cloud、Dubbo、JVM、集合、多线程、JPA、MyBatis、MySQL 等技术知识。

需要的小伙伴可以点击 技术笔记 获取!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/27985.shtml

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

相关文章

光电展厅如何运用数字多媒体实现互动传播?

近年来,展厅设计行业在多媒体技术的推动下,迎来了前所未有的变革与繁荣。在这一浪潮中,光电展厅凭借其智能化科技的应用和紧跟时代潮流的设计,成为了电力知识普及的璀璨舞台。它不仅在展示形式上实现了多元化和创新,更…

【linux】认识“文件”的本质,理解“文件系统”的设计逻辑,体会linux优雅的设计理念

⭐⭐⭐个人主页⭐⭐⭐ ~~~~~~~~~~~~~~~~~~ C站最❤❤❤萌❤❤❤博主 ~~~~~~~~~~~~~~~~~~~ ​♥东洛的克莱斯韦克-CSDN博客♥ ~~~~~~~~~~~~~~~~~~~~ 嗷呜~ ✌✌✌✌ 萌妹统治世界~ 🎉🎉🎉🎉 ✈✈✈✈相关文章✈✈✈✈ &#x1f4a…

REST风格

黑马程序员Spring Boot2 文章目录 1、REST简介1.1 优点1.2 REST风格简介1.3 注意事项 2、RESTful入门案例 1、REST简介 1.1 优点 隐藏资源的访问行为,无法通过地址的值对资源适合中操作书写简化 1.2 REST风格简介 按照RST风格访问资源时使用行为动作区分对资源进…

unity跑酷游戏(源码)

包括:触发机关, 优化 fog的调试 效果 碰到障碍物游戏时间暂停(挂载到障碍物上) 上面需要有碰撞体 游戏物体上需要有标签 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Barri…

SSM考研咨询app-计算机毕业设计源码05262

摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设考研咨询app。 本设计…

系统运维联盟 5 月会议召开,围绕“进展、规划与合作”展开讨论

2024 年 5 月 28 日,龙蜥社区系统运维联盟(SOMA,以下简称“运维联盟”)月度会议于线上召开,12 家运维联盟单位、 20 位代表出席,缺席 1 家。本次会议由龙蜥社区运营委员会副主席、运维联盟秘书处负责人金美…

使用Python和TCN进行时间序列预测:一个完整的实战示例

使用Python和TCN进行时间序列预测:一个完整的实战示例 时间卷积网络(TCN)已被证明在处理序列数据方面表现出色,尤其是在需要捕获长期依赖关系的任务中。在本文中,我们将通过一个简单的例子,展示如何使用Py…

24年最新版基础入门大模型辅助Python编程指南

今天这篇文章只会聊 Python 入门基础,如何通过大模型辅助Python 编程,在 后续的文章里慢慢聊。 一点点 python都不会。又想用大模型带飞,辅助 python 编程,提升数据分析能力和效率,怎么办? 一点都不需要担…

孟德尔随机化R包:TwoSampleMR和MR-PRESSO安装

1. 孟德尔随机化R包 看一篇文章,介绍孟德尔随机化分析,里面推荐了这两个R包,安装了解一下: Methods:Genome-wide association study (GWAS) data for autoimmune diseases and AMD were obtained from the IEU Open GWAS databas…

Three.js动效(第12辑):效果炫酷,但性能问题突出,如何破?

Three.js是一款强大的3D渲染引擎,但是在处理大量数据时,可能会出现性能问题。贝格前端工场结合过往经验,给大家几条性能优化的建议。 1. 减少渲染次数: 可以通过合并对象、使用InstancedMesh等方式减少渲染次数,从而…

Nginx+keepalived实现高可用

目录 主要功能 典型应用场景 优点 keepalived工作原理 Nginxkeepalived高可用实验 一. 环境准备 二. 下载并部署配置 对master和backup都操作 对master主机操作 对备用backup主机进行操作 验证当主节挂掉,VIP能否转义到备用机 "Keepalived" …

SpringBoot+Vue实现Excel文档导入和导出

1.准备工作 1.1.前端程序 在前端首先加上批量导出的按钮&#xff0c;如下 <el-button size"small" type"warning" plain click"exportData"> 批量导出 </el-button> 在添加了点击事件之后&#xff0c;在methods中要与之对应的添加上…

c#引用dll报错cs8370功能“本地函数特性“在c#7.3中不可用

cs8370:功能"本地函数特性"在c#7.3中不可用 解决方法&#xff1a; 代码放在form类里面

SJ703安全帽防静电测试仪

一、仪器用途 专门检测安全帽防静电性能。 二、仪器特征 1、携带使用轻便、量程宽广、读数准确&#xff0c;耐震性强等卓越优点 2、超上限时显示‘1’提示和低于下限时声响报警。 3、电池欠压时显示欠压符号“←”提示。 4、交流或直流&#xff08;电池&#xff09;供电任…

Java17 --- RabbitMQ之插件使用

目录 一、Federation插件 1.1、运行两个rabbitmq实例 1.2、启用插件 1.3、在下游端点添加上游端点 1.4、创建策略 1.6、测试 二、联邦队列 2.1、创建策略 2.2、创建交换机与队列 2.2.1、创建52000的队列与交换机 2.2.2、创建62000的队列 三、Shovel 3.1、启…

Echats-wordcloud 文字云图的踩坑点【Unknown series wordCloud】

在词云渲染时遇到渲染不出来的问题&#xff1a; 原因分析&#xff1a; 1、echart和wordcloud版本不匹配&#xff08;我的是匹配的&#xff09; 解决方案&#xff1a; 1、echart和wordcloud版本要匹配&#xff1a; echart4x 使用wordcloud1x版本 echart5x 使用wordcloud2x版本…

Echarts图表: 矩形树图都有哪些配置项,一文告诉你

Hello&#xff0c;本期和大家分享矩形树图的配置项&#xff0c;欢迎评论区和贝格前端工场互动交流。 一、矩形树图是什么 矩形树图是ECharts中的一种图表类型&#xff0c;用于展示树形结构的数据。矩形树图通过矩形的大小和位置来表示树形结构中节点的层次关系和数据的大小。…

实例化游戏物体的实例(生成游戏物体)

一、实例1&#xff1a;实例化 1、准备工作&#xff1a;制备预制体&#xff0c;命名。如Circle 2、Create Empty&#xff0c;名字自取。如&#xff1a;CirclePrefab 3、给CirclePrefab添加Test.cs public GameObject CirclePrefab; // 预制体变量&#xff0c;用于存储Circle预…

基于matlab的MTCNN(多任务卷积神经网络)人脸检测算法

关键词&#xff1a;Matlab&#xff1b;深度学习&#xff1b;多任务卷积神经网络&#xff1b;人脸检测&#xff1b; 背景 在不受约束的环境中&#xff0c;由于个体姿势的多样性、光照条件的变化以及潜在的遮挡问题&#xff0c;人脸检测和对齐任务面临诸多挑战。近期的研究表明…

Elasticsearch搜索引擎(高级篇)

3.1 查询语法 | 《ElasticSearch入门到实战》电子书 (chaosopen.cn) day09-Elasticsearch02 - 飞书云文档 (feishu.cn) 目录 第一章 DSL查询 1.1 基本语法 1.2 叶子查询 全文检索查询 精确查询 1.3 复合查询 算分函数查询 bool查询 1.4 排序 1.5 分页 基础分页 深度分…