芋道源码解析之数据权限
本文最后更新于 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 执行流程源码解读
调用流程大致如下:
未完待续