若依框架中@DataScope数据权限注解的使用与自定义sql语句。

介绍

若依框架本身具有角色、部门、用户业务。
在业务中,用户必须绑定一个角色,而角色又必须将自身绑定到部门,角色绑定了哪些部门,就决定着隶属于该角色的用户能对哪些部门数据进行增删改。
那么,怎么实现让用户只能遵循其绑定角色所指定的部门,来进行数据范围控制呢?
一般情况下,假如我们对一张表要进行查询或更新的话,需要在sql语句中,where条件语法后面 加上 dept.id = {currentDeptId} 来进行过滤,
例如下面的sql语句:

select * from sys_user
where dept_id = {currentUserDeptId}

但是,在若依框架中,我们只需要在Service层的方法上加入@DataScope注解,
并分别通过deptAlias和userAlias属性,指定出部门表和用户表在sql语句中的别名是什么的话,
不需要我们手动在sql语句后面过滤条件了。

使用

下面,我们通过演示,来介绍如何使用@DataScope注解。
1.首先,我们有一个部门表的实体类,叫SysDept。并且,它还必须继承了BaseEntity这个类。
在这里插入图片描述

而BaseEntity实体类中,有一个类型为map,名称为params的属性。
在这里插入图片描述
2.在对应的mapper.xml文件中,对应sql语句的末尾,我们引用SysDept所继承的BaseEntity父类中的’params’属性。
${params.dataScope}
在这里插入图片描述
3.在Service层方法上,加入@DataScope注解,并指定sql语句中用户表和部门表的别名。
在这里插入图片描述
4.接下来我们前端访问controller,debug然后进入到service层的这个方法,我们会惊奇的发现。SysDept所继承的BaseEntity父类的params属性,有了值。
而这个值,就是数据过滤相关的sql语句。
在这里插入图片描述

@DataScope注解。现在搞懂了吧。
若依框架会根据访问该方法的前端用户所绑定的角色,自动生成相应的sql语句给BaseEntity类的params属性,进而在mapper.xml中引用它,来实现数据权限范围的控制。

改造DataScope生成的sql语句(原理)

那么,既然使用了@DataScope后,就会根据前端用户的相关权限参数,自动来生成sql语句用以过滤。
那就很好奇了,
1,这个sql语句是在哪儿生成的?
2,前端用户的权限,肯定也是需要通过响应的判断,来生成的吧,那么在哪儿判断的?
3,假如它当前自动生成的sql语句,不符合我的现在业务的需求,我怎么去该?
4,它是如何实现的?

其实这是若依框架通过一个叫做‘DataScopeAspect'的切面类来实现的。
在这里插入图片描述
在从controller进入service层之前,凡是service层使用了@DataScope注解的方法,都会先执行这个切面类,再去执行service层方法。
以其中的’dataScopeFilter‘方法举例子,它会判断当前的角色id,去生成对应的sql语句,然后赋值给BaseEntity的params属性,
在这里插入图片描述
到了这里,相信大家如果遇到sql语句不符合业务需求的场景,也知道要在这切面类里做一些修改了。

参考:https://blog.csdn.net/weixin_38657051/article/details/90018814

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值