芋道源码解析之数据权限

本文最后更新于 2025年2月8日

引言

芋道的数据权限模块代码,涉及的类和方法很多,环环相扣,需要运行项目一步一步debug分析才能看懂。该模块的代码按照功能细分,大致可以分为两部分:

1.拦截,解析和重写SQL:根据不同角色的数据权限控制逻辑来为每个涉及到的表和字段重写(追加)过滤数据的SQL条件。

2.数据权限注解处理器:通过自定义一个数据权限注解并实现一个切面来为加了注解的方法进行一些切入操作,来动态调控某个具体方法的数据权限,使得一些方法可以不被统一设置的数据权限规则所控制,实现一些特定的业务逻辑,是需要结合拦截,解析和重写SQL的功能来使用的。

1.拦截,解析和重写SQL

2.4.0-jdk8-SNAPSHOT版本的数据权限是基于mybatis-plus的插件拦截机制实现的,具体是对执行修改、删除和查询的SQL进行拦截、解析,然后再重写数据权限的条件。使用该插件需要实现com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler接口,SQL被拦截时,接口的回调方法会被执行,再在回调方法内根据当前用户的角色,对涉及到的不同的表分别实现重写SQL条件的逻辑,在封装成规则对象返回给拦截器。

1.1 主要涉及类和接口

mybatis-plus:

  • com.baomidou.mybatisplus.extension.plugins.inner.DataPermissionInterceptor 数据权限插件的主要实现类,在查询或删除修改时进行拦截和解析,为不同地方的条件进行数据权限SQL的重写和追加。

  • com.baomidou.mybatisplus.extension.plugins.inner.BaseMultiTableInnerInterceptor 通过被DataPermissionInterceptor类继承发挥作用,提供SQL解析功能。

  • com.baomidou.mybatisplus.extension.plugins.inner.InnerInterceptor 通过被DataPermissionInterceptor类实现发挥作用,在适当时机触发beforeQuery(), beforePrepare()方法,进而执行SQL解析和重写的功能。

  • com.baomidou.mybatisplus.extension.parser.JsqlParserSupport 工具类,是mp对jsqlparser的封装,更好的实现SQL的解析。

  • com.baomidou.mybatisplus.extension.plugins.handler.MultiDataPermissionHandler 数据权限处理器,由实现类来根据不同的表和字段进行SQL重写。

  • com.baomidou.mybatisplus.extension.plugins.handler.DataPermissionHandler 作用同MultiDataPermissionHandler。

yudao:

  • cn.iocoder.yudao.framework.datapermission.core.db.DataPermissionRuleHandler
  • cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRuleFactory
  • cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRuleFactoryImpl
  • cn.iocoder.yudao.framework.datapermission.core.rule.DataPermissionRule
  • cn.iocoder.yudao.framework.datapermission.core.rule.dept.DeptDataPermissionRule

1.2 执行流程源码解读

调用流程大致如下:

未完待续


芋道源码解析之数据权限
https://blog.liuzijian.com/post/source-code-yudao-data-permission.html
作者
Liu Zijian
发布于
2025年1月22日
更新于
2025年2月8日
许可协议