【RuoYi-Vue-Plus】学习笔记 09 - 数据权限调用流程分析(参照 Mybatis Plus 数据权限插件)

2023-11-19

前言

之前写过一篇关于数据权限的文章【【若依】开源框架学习笔记 06 - 数据权限 】,在原版若依和 3.4.0 及其以下版本的 RuoYi-Vue-Plus 中使用的都是基于切面方式实现的数据权限功能。

在 RuoYi-Vue-Plus 3.5.0 中,狮子大佬 重写了数据权限的实现。

对于新的数据权限的使用方法也在框架wiki中有说明,所以本文只是在此基础上做简单的分析,仅作为学习之用,如有错误也请大佬们指出。

参考目录

框架中没有直接使用 Mybatis Plus 原生的数据权限插件,但是从写法来看应该对此有所借鉴,所以也可以参考一下 Mybatis Plus 的数据权限插件源码实现自己的数据权限功能。

代码分析

框架wiki中关于数据权限的简单说明:这里是引用

1、数据权限配置 MybatisPlusConfig

在这里插入图片描述
MybatisPlusInterceptor 拦截器中加入了自定义的数据权限拦截器组件 PlusDataPermissionInterceptor

2、数据权限拦截器 PlusDataPermissionInterceptor

在这里插入图片描述
数据权限拦截器继承了 JsqlParserSupport Jsql 解析器,实现了 InnerInterceptor 拦截器接口:

  • beforeQueryExecutor.query 操作前置处理 - InnerInterceptor
    在这里插入图片描述
  • beforePrepareStatementHandler.prepare 操作前置处理 - InnerInterceptor
    在这里插入图片描述
  • processSelect :处理查询 - JsqlParserSupport
  • processUpdate :处理更新 - JsqlParserSupport
  • processDelete :处理删除 - JsqlParserSupport
    在这里插入图片描述

在 Mybatis Plus 数据权限插件源码中,也有类似的拦截器 DataPermissionInterceptor。不过只重写了两个方法 beforeQueryprocessSelect
在这里插入图片描述

3、数据权限处理器 PlusDataPermissionHandler

在拦截器处理查询的方法中有调用 setWhere 方法进行 SQL 语句 Where 条件的设置。主要的逻辑就是调用处理器获取 SQL 的方法 getSqlSegment

PlusDataPermissionHandler#getSqlSegment
在这里插入图片描述
当然这个方法也是根据框架进行了扩展,源码中只是一个简单的接口。
在这里插入图片描述

方法调用流程

1、测试方法

TestDemoController#list()
在这里插入图片描述
这是一个新增的方法,原来 Demo 中有一个加上了分页的测试方法,这里暂时排除分页进行测试。

TestDemoServiceImpl#queryList()
在这里插入图片描述
buildQueryWrapper 是根据请求参数构建条件构造器,测试方法中不传参数,则会查询全部数据。

ServicePlusImpl#listVo()
在这里插入图片描述
ServicePlusImpl 是封装的通用实现类。

BaseMapperPlus#selectVoList()
在这里插入图片描述
this.selectList(wrapper) 就是调用对应的 Mapper 的查询列表方法。

TestDemoMapper#selectList
在这里插入图片描述
这里是对原生方法的重写,加入了自定义数据权限注解 @DataPermission 以及 @DataColumn

如果 SQL 是自定义方法也是在对应方法上加上注解即可。
在这里插入图片描述
在这里插入图片描述

2、超级管理员测试

2.1、beforeQuery()

PlusDataPermissionInterceptor#beforeQuery()

在这里插入图片描述
首先判断忽略注解。
InterceptorIgnoreHelper#willIgnoreDataPermission()
在这里插入图片描述
InterceptorIgnoreHelper#willIgnore()
在这里插入图片描述
在这里插入图片描述
结果为 false

回到 beforeQuery 中,继续判断注解是否有效。
在这里插入图片描述
PlusDataPermissionHandler#isInvalid()
在这里插入图片描述
在这里插入图片描述
结果为 false

最终得到 SQL 语句。
在这里插入图片描述
在这里插入图片描述
SQL 解析器 JsqlParserSupport#parserSingle
在这里插入图片描述
执行SQL解析。

JsqlParserSupport#processParser()

在这里插入图片描述
调用处理查询的方法。

PlusDataPermissionInterceptor#processSelect()

在这里插入图片描述
设置 Where 条件。
PlusDataPermissionInterceptor#setWhere()
在这里插入图片描述

PlusDataPermissionHandler#getSqlSegment()

根据注解以及权限获取 SQL 片段。
在这里插入图片描述

  • 1、通过方法 findAnnotation(mappedStatementId) 获取到注解内容。
    PlusDataPermissionHandler#findAnnotation()
    首先从 dataPermissionCacheMap 中获取,没有则通过 AnnotationUtil.getAnnotation() 方法获取,并存到 dataPermissionCacheMap 中。
    在这里插入图片描述
    然后返回得到的注解内容。

  • 2、获取当前用户并判断权限。
    首先通过 DataPermissionHelper.getVariable("user") 方法获取用户信息,如果没有,则通过查询数据库获取,并把用户信息通过 DataPermissionHelper 存到上下文中。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    此处为超级管理员直接返回 where 语句。
    在这里插入图片描述

至此完成了 beforeQuery() 整个方法的流程。

2.2、beforePrepare()

在这里插入图片描述

2.3、执行输出

在这里插入图片描述
在这里插入图片描述

3、非超级管理员测试

在这里插入图片描述
注:非超级管理员测试的流程和超级管理员基本相同,下面只分析不同的部分(主要是在where条件的获取不一样),如果有不了解的地方可以多 Debug。

PlusDataPermissionHandler#getSqlSegment()
在这里插入图片描述
非超级管理员用户,通过 buildDataFilter() 方法构造 SQL 查询条件。

3.1、buildDataFilter()

PlusDataPermissionHandler#buildDataFilter()

在这里插入图片描述

  • 1、获取拼接字符
    在这里插入图片描述
  • 2、从 DataPermissionHelper 获取用户信息并保存到上下文中。
    在这里插入图片描述
  • 3、获取用户角色信息并循环进行操作
    在这里插入图片描述
    获取用户角色权限泛型。
    在这里插入图片描述
    循环数据权限注解信息并操作。
    在这里插入图片描述
    @sdss.getDeptAndChild 对应的是方法 SysDataScopeServiceImpl#getDeptAndChild()
    在这里插入图片描述
    在这里插入图片描述
    该方法获取用户权限部门id。解析得到 SQL 语句。
    在这里插入图片描述
  • 4、处理 SQL 并返回
    在这里插入图片描述
    此处需要截掉 OR 是因为只有一个条件时不需要 OR,否则 SQL 就变成了 where OR ...

SQL 查询条件构造完成,返回 PlusDataPermissionHandler#getSqlSegment() 方法。
在这里插入图片描述
由上面可得到最终的 SQL 语句查询条件。其余流程和上面超级管理员基本一致。

3.2、执行输出

在这里插入图片描述
在这里插入图片描述

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【RuoYi-Vue-Plus】学习笔记 09 - 数据权限调用流程分析(参照 Mybatis Plus 数据权限插件) 的相关文章

随机推荐

  • unity3d之 C# WaitFOrSeconds()

    学习unity3d不久 在使用WaitFOrSeconds 时 遇到了不少麻烦 故记录 以警示后人 首先介绍C 和javascript 在使用它有很大的区别 javascript可以直接使用 yield WaitFOrSeconds 5 即
  • 腾讯云 API 网关产品发布

    欢迎大家前往腾讯云社区 获取更多腾讯海量技术实践干货哦 腾讯云已在近期上线了 API 网关产品 协助开发者通过简单方式即可完成 API 配置管理 发布版本 访问控制等功能 并可进一步对接腾讯云云市场中的 API 市场 参与到 API 经济的
  • 用栈来判断括号匹配问题

    用栈实现 输入一行符号 以 结束 判断其中的括号是否匹配 括号包括 lt gt 如果匹配 输出 right 如果不匹配 给出错误提示 包括 1 对称符号都匹配 输出 right 2 处理到某个符号时不匹配了 输出 The character
  • 美拍应该如何引流?如何利用美拍引流?美拍引流方法

    现如今 抖音 美拍等短视频APP逐渐地在改变人们的生活习惯 很多人在闲暇时都会刷刷短视频 这对于做营销的我们而言 人越多的地方机会就越大 所以肯定是不会放过这个巨大的流量池 那么 我们应该如何利用这些美拍吸粉引流呢 第一步 注册养号 下载了
  • markdown表情大全

    markdown表情 该文是搜集的网络资源整理 为了写博客需要用到一些有趣的表情 特此记录 将对应emoji表情的符号码复制后输入你的markdown文本即可显示emoji表情 如 blush 显示为 人物 syntax preview s
  • 全国大学生数学建模竞赛——大赛介绍与赛后总结

    全国大学生数学建模竞赛 训练过程及赛后总结 前言 今天是2018年9月18日 一个特殊的日子 距离全国大学生数学建模大赛已经过去两天了 三天两夜的比赛 每天晚上几乎做到凌晨 确实很辛苦 但是现在回过头来看看 无论成绩如何 一切的辛苦与努力都
  • ADS2020.2安装

    双击安装包中的 exe文件 开始安装 安装结束后 直接点击退出 然后将crack文件夹中的两个文件夹 分别复制到刚刚的安装路径下 分别替换12个和2个同名文件 注意 这两个文件夹的名字要和刚刚安装的文件夹的名字一致 就是将Crack文件夹中
  • C++头文件

    作为一个二手的 net程序员 你看到了C 头文件一定就犯迷糊了 这到底是个啥玩意 再我纠结了24个小时 google20次 度娘10下 看过10来骗文章以后 我可能稍微开窍了 我对C 头文件总结 与 net比较如下 一 C 头文件究竟是什么
  • onvif协议服务器,Onvif第四课 服务器端发现实现

    场景 需要开发一个服务器发现模块 等待客户端的探测报文 在Linux服务器下组播地址imr interface可以不绑定 mcast imr multiaddr s addr inet addr 239 255 255 250 mcast
  • Python实现企业微信群告警

    Python实现企业微信告警 1 创建企业微信群机器人 1 1 什么是企业微信群机器人 企业微信群机器人是企业微信平台提供的一种功能 可以通过Webhook方式将消息发送到指定的企业微信群中 它可以用于自动化发送通知 告警等信息 实现监控和
  • 证据理论(1)—— DS证据理论基本理论

    证据理论 证据理论 Theory of Evidence 是由 Dempster 首先提出 由Shafer进一步发展起来的一种不精确推理理论 也称为 Dempster Shafer DS 证据理论 证据理论可以在没有先验概率的情况下 灵活并
  • 基于Matlab分析的电力系统可视化研究

    欢迎来到本博客 博主优势 博客内容尽量做到思维缜密 逻辑清晰 为了方便读者 座右铭 行百里者 半于九十 本文目录如下 目录 1 概述 2 运行结果 3 参考文献 4 Matlab代码及数据 1 概述 电力系统可视化研究是电力系统分析中一项具
  • IKE协议与实现

    一 IKE的作用 当应用环境的规模较小时 可以用手工配置SA 当应用环境规模较大 参与的节点位置不固定时 IKE可自动地为参与通信的实体协商SA 并对安全关联库 SAD 维护 保障通信安全 二 IKE的机制 IKE属于一种混合型协议 由In
  • php curl ajax get请求,PHP的curl的get,post请求-Fun言

    GET请求如下 param string url return mixed public function doGet url 初始化 ch curl init curl setopt ch CURLOPT URL url 执行后不直接打印
  • 面试题:从用户在浏览器输入域名,到浏览器显示出页面,这中间发生了什么(工作过程)?

    这是一道很基础的题 但是也容易被忽视 主要是要进行域名解析 1 在浏览器中输入地址 如 www baidu com 2 向DNS服务器查询网站IP地址 3 DNS服务器返回网站IP地址 如 119 75 217 56 4 浏览器得到IP地址
  • 使用pipeline加速Redis

    面试官 怎么快速删除10万个key 某厂面试题 prod环境 如何快速删除10万个key 带着思考 我们一来研究Redis pipeline why pipeline Redis客户端与server的请求 响应模型 前面的文章 Redis底
  • C#开发WinForm之DataGridView开发

    C 开发WinForm之DataGridView开发 原文 https blog csdn net achenyuan article details 84632751 文章目录 C 开发WinForm之DataGridView开发 基本的
  • 在Linux中使用selenium(环境部署)

    在Linux中使用selenium 环境部署 1 安装chrome 用下面的命令安装Google Chrome yum install https dl google com linux direct google chrome stabl
  • 【单片机笔记】K型热电偶单运放放大,单片机ADC采集电路

    以下内容来自百科 K型热电偶作为一种温度传感器 K型热电偶通常和显示仪表 记录仪表和电子调节器配套使用 K型热电偶可以直接测量各种生产中从0 到1300 范围的液体蒸汽和气体介质以及固体的表面温度 高清K型热电偶图片 K型热电偶是目前用量最
  • 【RuoYi-Vue-Plus】学习笔记 09 - 数据权限调用流程分析(参照 Mybatis Plus 数据权限插件)

    文章目录 前言 参考目录 代码分析 1 数据权限配置 MybatisPlusConfig 2 数据权限拦截器 PlusDataPermissionInterceptor 3 数据权限处理器 PlusDataPermissionHandler