介绍
若依框架本身具有角色、部门、用户业务。
在业务中,用户必须绑定一个角色,而角色又必须将自身绑定到部门,角色绑定了哪些部门,就决定着隶属于该角色的用户能对哪些部门数据进行增删改。
那么,怎么实现让用户只能遵循其绑定角色所指定的部门,来进行数据范围控制呢?
一般情况下,假如我们对一张表要进行查询或更新的话,需要在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