若依框架---权限管理设计

前言

若依权限管理包含两个部分:菜单权限 和 数据权限。菜单权限控制着我们可以执行哪些操作。数据权限控制着我们可以看到哪些数据。

菜单是一个概括性名称,可以细分为目录菜单按钮,以若依自身为例:

  • 目录,就是页面导航,也可以理解为导航父菜单(二级导航或三级导航)如:系统管理;某个父菜单没有权限,表示需要隐藏或禁用这个父菜单。
  • 菜单,就是导航子菜单,如:用户管理;某个子菜单没有权限,表示需要隐藏或禁用这个子菜单,也就无法进入子菜单关联的页面,如:用户管理页面。
  • 按钮,可以泛化理解为页面组件,如:新增;某个组件没有权限,表示需要隐藏或禁用这个组件,也就无法执行这个组件关联的事件,如:点击。

菜单权限

菜单权限是基于 角色 实现的,如下图:

菜单授权

  1. 创建或编辑菜单时,设置菜单权限字符,相当于菜单唯一标识符;
  2. 创建或编辑角色时,设置该角色拥有权限的菜单列表,即:角色关联菜单权限标识符;
  3. 创建或编辑用户时,设置该用户拥有的角色列表,即:角色关联用户;

菜单鉴权

验证用户对于菜单是否有权限,可以通过角色实现:

  1. 获取用户拥有的角色列表;
  2. 如果角色列表包含这个角色,则表示有权限;否则,表示没有权限。

也可以通过菜单权限字符实现:

  1. 获取用户拥有的角色列表;
  2. 获取这些角色拥有权限的菜单(权限字符)列表;
  3. 如果菜单列表包含这个菜单,则表示有权限;否则,表示没有权限。

前端鉴权

前端使用菜单鉴权时,需要使用权限指令:

// 角色
<el-button v-hasRole="['admin']">管理员才能看到</el-button>

// 权限字符
<el-button v-hasPermi="['system:user:add']">存在权限字符串才能看到</el-button>

后端鉴权

前端鉴权只能保证可以隐藏或禁用菜单,并不能保证菜单关联的后端接口请求不被非法调用,若依支持在后端接口方法使用角色或权限字符声明权限:

// 角色
@PreAuthorize("@ss.hasRole('user')")

// 权限字符
@PreAuthorize("@ss.hasPermi('system:user:list')")

 若依没有为后端接口专门设计权限管理模块,它认为后端接口和菜单具有对应关系,可以直接使用菜单的角色或权限字符用于后端接口的权限声明。

数据权限

数据权限也是基于 角色 实现的,如下图:

支持五种权限模式,按权限大小依次排列:

  • 全部数据权限,表示拥有所有部门的数据权限
  • 自定数据权限,表示拥有指定的若干部门的数据权限
  • 本部门数据权限,表示仅拥有用户所属部门(不包括子部门)的数据权限
  • 本部门及以下数据权限,表示仅拥有用户所属部门和所有子部门的数据权限
  • 仅本人数据权限,表示仅拥有用户本人的数据权限

数据模式需要使用 用户部门。这就要求我们创建数据表时,除业务数据自身字段以外,需要额外增加两个字段:

  • userId,表示用户 ID;
  • deptId,表示部门 ID;

用户可以拥有多个角色,但只能属于一个部门。 部门支持有父子关系,角色不支持父子关系。

数据授权

  1. 创建或编辑部门时,设置部门父子关系;
  2. 创建或编辑角色时,设置角色的数据权限模式;如果是自定数据权限,需要设置部门列表;

数据鉴权

数据鉴权实际是数据过滤,即:过滤用户没有权限的数据。实际使用时,我们只需要在查询数据的方法上添加注解:

@DataScope

声明启用数据过滤即可。这样若依查询数据时,仅会返回用户有权限的数据。

若依对于使用数据权限的数据方法实现是有一定要求的,我们不描述具体细节,仅给出核心流程:

  1. 获取用户的角色列表;
  2. 获取这些角色的数据权限模式;
  3. 计算这些数据权限中的最大权限;
  4. 根据这个最大权限,转换成该权限对应的部门 ID(一个或多个) 或 用户 ID;
  5. 动态修改查询数据方法的查询 SQL 语句,添加基于部门 ID 或用户 ID 的过滤语句;
  6. 执行修改后的查询 SQL 语句;

可以看出,数据权限本质上就是基于部门 ID 或用户 ID 的数据过滤,只是这个过滤是若依为我们自动完成的。

结语

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

C++三种继承方式

C继承的一般语法为&#xff1a;class 派生类名:&#xff3b;继承方式&#xff3d; 基类名{派生类新增加的成员};继承方式限定了基类成员在派生类中的访问权限&#xff0c;包括 public&#xff08;公有的&#xff09;、private&#xff08;私有的&#xff09;和 protected&#…

Github学生包申请秒过经验并使用Copilot

写在前面 前提是在校学生&#xff0c;且有学校邮箱&#xff0c;当然你也得有Github账户前往学信网下载 教育部学籍在线验证报告将报告转换成英文版本&#xff0c;我用的是手机夸克自带的拍照翻译功能 具体流程 设置Github个人信息 来到 https://github.com/settings/profil…

【linux】进程信号——信号的保存和处理

文章目录一、阻塞信号1.1 信号的相关概念1.2 在内核中的构成二、捕捉信号概念2.1 内核态和用户态2.2 信号捕捉流程图三、信号操作3.1 sigset_t信号集3.2 信号集操作函数3.2.1 更改block表sigprocmask3.2.2 获取pending信号集sigpending3.3 验证四、捕捉信号操作4.1 内核捕捉信号…

样本量很少如何获得最佳的效果?最新小样本学习工具包来啦!

原文&#xff1a;样本量很少如何获得最佳的效果&#xff1f;最新小样本学习工具包来啦&#xff01; 开发者简介 王雅晴&#xff0c;PaddleFSL负责人、飞桨高级开发者技术专家&#xff08;高级PPDE&#xff09;。2019年毕业于香港科技大学计算机科学及工程学系。通过百度公司A…

基于Golang实现多人在线游戏的AOI算法

1、AOI基本介绍 游戏的AOI(Area of Interest)算法应该算作游戏的基础核心了&#xff0c;许多逻辑都是因为AOI进出事件驱动的&#xff0c;许多网络同步数据也是因为AOI进出事件产生的。因此&#xff0c;良好的AOI算法和基于AOI算法的优化&#xff0c;是提高游戏性能的关键。 为…

java如何手动导jar包

今天用IDEA&#xff0c;需要导入一个Jar包&#xff0c;因为以前都是用eclipse的&#xff0c;所以对这个idea还不怎么上手&#xff0c;连打个Jar包都是谷歌了一下。 但是发现网上谷歌到的做法一般都是去File –> Project Structure中去设置&#xff0c;有没有如同eclipse一样…

HTTP/2.x:最新的网页加载技术,快速提高您的SEO排名

2.1 http2概念HTTP/2.0&#xff08;又称HTTP2&#xff09;是HTTP协议的第二个版本。它是对HTTP/1.x的更新&#xff0c;旨在提高网络性能和安全性。HTTP/2.0是由互联网工程任务组&#xff08;IETF&#xff09;标准化的&#xff0c;并于2015年发布。2.2 http2.x与http1.x区别HTTP…

如何在 Vue 中使用 防抖 和 节流

大厂面试题分享 面试题库前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★地址&#xff1a;前端面试题库 https://mp.weixin.qq.com/s?__bizMzU5NzA0NzQyNg&mid2247485824&idx3&sn70cd26a7c0c683de64802f6cb9835003&scene21#wech…

Flutter GetX 实现 ChatGPT 简单聊天界面

Flutter 是一款跨平台的移动应用开发框架&#xff0c;而 GetX 是 Flutter 中一种简单易用的状态管理和路由管理工具。本篇我们将使用 Flutter 和 GetX 实现一个简单的聊天界面&#xff0c;以与 ChatGPT 进行交互。 我们需要在 Flutter 项目中引入 GetX 库。在pubspec.yaml文件…

学大数据算跟风吗?

随着互联网、物联网和人工智能等技术的不断发展&#xff0c;大数据技术逐渐进入人们的视野&#xff0c;成为一个备受关注的热点话题。那么&#xff0c;大数据专业好学吗&#xff1f;前景如何&#xff1f;下面我们来一起探讨一下。 一、大数据专业的学习难度 大数据技术是一种综…

八大排序算法之归并排序(递归实现+非递归实现)

目录 一.归并排序的基本思想 归并排序算法思想(排升序为例) 二.两个有序子序列(同一个数组中)的归并(排升序) 两个有序序列归并操作代码: 三.归并排序的递归实现 递归归并排序的实现:(后序遍历递归) 递归函数抽象分析: 四.非递归归并排序的实现 1.非递归归并排序算法…

全景丨0基础学习VR全景制作,后期篇第九章:控制点和遮罩工具

本节教程&#xff0c;我们介绍拼接软件PTGui Pro 矫正拉直全景图水平的方法。矫正拉直全景图可以通过后期软件PTGui做到&#xff0c;但我更想跟大家强调的是前期拍摄时&#xff0c;查看水平仪&#xff0c;调平三脚架尤为重要。后期软件强行矫正&#xff0c;不可避免的会因为追求…

蓝桥杯Web前端练习题-----水果拼盘

一、水果拼盘 介绍 目前 CSS3 中新增的 Flex 弹性布局已经成为前端页面布局的首选方案&#xff0c;本题可以使用 Flex 属性快速完成布局。 准备 开始答题前&#xff0c;需要先打开本题的项目代码文件夹&#xff0c;目录结构如下&#xff1a; ├── css │ └── style.…

acm省赛:高桥和低桥(三种做法:区间计数、树状数组、线段树)

题目描述 有个脑筋急转弯是这样的&#xff1a;有距离很近的一高一低两座桥&#xff0c;两次洪水之后高桥被淹了两次&#xff0c;低桥却只被淹了一次&#xff0c;为什么&#xff1f;答案是&#xff1a;因为低桥太低了&#xff0c;第一次洪水退去之后水位依然在低桥之上&#xff…

chatGPT爆火,什么时候中国能有自己的“ChatGPT“

目录 引言 一、ChatGPT爆火 二、中国何时能有自己的"ChatGPT" 三、为什么openai可以做出chatGPT? 四、结论 引言 随着人工智能技术的不断发展&#xff0c;自然语言处理技术也逐渐成为了研究的热点之一。其中&#xff0c;ChatGPT作为一项领先的自然语言处理技术…

PID控制算法详解

1. 前言 PID 即 Proportional&#xff08;比例&#xff09;&#xff0c;Integral&#xff08;积分&#xff09;&#xff0c;Differential&#xff08;微分&#xff09;的英文缩写。顾名思义&#xff0c;PID 控制算法是结合比例&#xff0c;积分和微分三种环节于一体的自动控制…

刷题之最长公共/上升子序列问题

目录 一、最长公共子序列问题&#xff08;LCS&#xff09; 1、题目 2、题目解读 ​编辑 3、代码 四、多写一题 五、应用 二、最长上升子序列问题&#xff08;LIS&#xff09; 1、题目 2、题目解读 3、代码 四、多写一道 Ⅰ、题目解读 Ⅱ、代码 一、最长公共子序列问题&…

Android实时显示时间日期(极简)

Android实时显示时间日期示例图示例图解析TextClock时间控件常用的xml属性及常用方法示例源代码.xml文件.java示例图 示例图解析 格式说明yyyy/MM/dd年月日HH:mm:ss时分秒EEEE星期几EE周几 TextClock时间控件 常用的xml属性及常用方法 属性对应的方法说明android:timeZonese…

7个最好的PDF编辑器,帮你像编辑Word一样编辑PDF

PDF 是具有数字思维的组织的重要交流工具。提供高效的工作流程和更好的安全性&#xff0c;可以创建重要文档并与客户、同事和员工共享。文档的布局已锁定&#xff0c;因此无论在什么设备上查看&#xff0c;格式都保持不变。这是让每个人保持一致的好方法——尤其是那些使用Micr…

JVM垃圾回收机制

文章目录JVM垃圾回收机制如何确定该对象是垃圾引用计数可达性分析如何释放对象常用策略JVM垃圾回收机制 以对象为单位来进行回收 如何确定该对象是垃圾 Java 中使用 可达性分析方法 Python 中时使用 引用计数方法 引用计数 使用额外的计数器&#xff0c;来记录某个对象有多少个…
最新文章