若依框架中@DataScope数据权限注解的使用与自定义sql语句。 您所在的位置:网站首页 自定义数据表示什么意思 若依框架中@DataScope数据权限注解的使用与自定义sql语句。

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

2024-07-11 06:35| 来源: 网络整理| 查看: 265

介绍

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



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有