深入分析若依数据权限@datascope (注解+AOP+动态sql拼接) 【循序渐进,附分析过程】

本文详细探讨了若依框架如何利用自定义注解@DataScope、AOP和动态SQL实现数据权限控制。通过对用户查询用户时的数据过滤进行分析,揭示了在Mapper层如何根据角色数据范围进行数据过滤,以及params.dataScope如何作为SQL语句被注入。文章还介绍了@DataScope注解在Service层的使用,并讲解了DataScopeAspect切面类的执行步骤,帮助读者理解sys_role_dept表在数据权限中的作用。
摘要由CSDN通过智能技术生成

笔者最近在努力的分析开源项目若依框架,今天看到了若依对数据权限进行控制的部分,自定义注解+AOP+动态SQL的注入,看的我是眼花缭乱,然后我又认真的复盘了一遍整个的实现过程,不由得感叹一句,若依YYDS~~

简单猜测

除了我们平时都知道的 路由权限(即对接口的访问权限外),在日常生产开发中,我们还应该有对数据的访问权限。

在若依这个框架中,通过角色中的数据范围这个属性来对数据权限进行控制。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8JiPrHVq-1649742911724)(D:softTyporaimageimage-20220412121559708.png)]

对应实体类:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uJq5nvTm-1649742911726)(D:softTyporaimageimage-20220412121959106.png)]

深入分析

一个用户肯定是 有一种角色的,也肯定是隶属于一个部门的。

这里咱们就以用户在查询用户时,即 selectUserList时所做的数据权限为例进行分析。

若依在进行数据权限的访问时,持久层(Mapper层)中对数据进行处理,根据用户角色的权限对数据进行过滤。

<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
   select u.user_id, u.dept_id, u.login_name, u.user_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.salt, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
   left join sys_dept d on u.dept_id = d.dept_id
   where u.del_flag = '0'
   <if test="userId != null and userId != 0">
      AND u.user_id = #{userId}
   </if>
   <if test="loginName != null and loginName != ''">
      AND u.login_name like concat('%', #{loginName}, '%')
   </if>
   <if test="status != null and status != ''">
      AND u.status = #{status}
   </if>
   <if test="phonenumber != null and phonenumber != ''">
      AND u.phonenumber like concat('%', #{phonenumber}, '%')
   </if>
   <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
      AND date_format(u.create_time,&
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值