目录
一:数据权限展示
进入方式:系统管理 -> 角色管理 -> 数据权限
二、数据权限作用及操作
1. 数据权限作用
用户管理:不同用户看到的用户数据有差别
用户admin可以看到的数据如下
而用户ry能看到的数据为
角色管理:不同用户看到的角色数据有差别
用户admin 的角色为超级管理员,超级管理员设置为具有访问全部数据权限
用户ry 的角色为普通角色,普通角色设置为只有访问本部门数据权限,其所属部门为测试部门
2. 数据权限操作
登录用户admin 进行如下操作:
用户admin 的角色为超级管理员,超级管理员设置为具有访问全部数据权限
用户ry 的角色为普通角色,普通角色设置为只有访问本部门数据权限,其所属部门为测试部门
三、数据权限后端源码分析
Controller
Service
Mapper
Java Mapper
xml Mapper
若依在进行数据权限的访问时,Mapper层中对数据进行处理,根据用户角色的权限对数据进行过滤。倒数第二行${params.dataScope}就是对数据范围进行过滤。
确定接口和相关代码:
函数调用链:doBefore -> handleDataScope -> dataScopeFilter 添加SQL 语句
AOP 类DataScopeAspect 处理注解@DataScope
根据当前登录用户的信息,判断是否为超级管理员,如果不是,则调用dataScopeFilter方法进行数据权限过滤。这种机制通常用于确保只有非管理员用户才会受到数据权限的约束,管理员用户可以访问所有数据。
AOP 类DataScopeAspect 对于全部权限、自定义权限、本部门及以下权限、仅本人权限最终添加的SQL 语句及作用
全部权限--SQL语句:""(空字符串)
作用:表示用户具有全部数据的访问权限,不需要添加任何过滤条件,即不进行数据权限的过滤。
自定义权限--SQL语句:动态生成类似 OR d.dept_id IN (SELECT dept_id FROM sys_role_dept WHERE role_id = X) 的条件,X为角色ID。
作用:根据用户的角色,查询出与该角色相关的部门数据,仅允许用户访问与这些部门相关的数据。
本部门权限--SQL语句:动态生成类似 OR d.dept_id = X 的条件,X为用户所属部门ID。
作用:限制用户只能访问自己所在部门的数据,不包括子部门的数据。
本部门及以下权限--SQL语句:动态生成类似 OR d.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = X or find_in_set(X, ancestors)) 的条件,X为用户所属部门ID。
作用:允许用户访问自己所在部门及其所有子部门的数据。
仅本人权限--SQL语句:动态生成类似 OR u.user_id = X 的条件,X为用户ID。
作用:限制用户只能访问自己的数据。
四、总结
数据权限限制的总体逻辑:
1.Controller
2.Service 上的注解@DataScope
3.监测@DataScope 的切面类DataScopeAspect [给继承BaseEntity 的子类属性params 添加SQL ]
4. Service
5.Java Mapper
6.xml Mapper [通过子类属性params 使用SQL 语句过滤数据]