若依项目中的数据权限管理详解

1,数据权限

在实际开发中,需要设置用户只能查看哪些部门的数据,这种情况一般称为数据权限。

例如对于销售,财务的数据,它们是非常敏感的,因此要求对数据权限进行控制, 对于基于集团性的应用系统而言,就更多需要控制好各自公司的数据了。如设置只能看本公司、或者本部门的数据,对于特殊的领导,可能需要跨部门的数据, 因此程序不能硬编码那个领导该访问哪些数据,需要进行后台的权限和数据权限的控制。

2,若依数据范围管理

默认系统管理员admin拥有所有数据权限(userId=1),默认角色拥有所有数据权限(如不需要数据权限不用设置数据权限操作)
在这里插入图片描述

注解参数说明

参数 类型 默认值 描述
deptAlias String 部门表的别名
userAlias String 用户表的别名

3,数据权限使用

1、在(系统管理-角色管理)设置需要数据权限的角色 目前支持以下几种权限

  • 全部数据权限
  • 自定数据权限
  • 部门数据权限
  • 部门及以下数据权限
  • 仅本人数据权限

2、在需要数据权限控制方法上添加@DataScope注解,其中d和u用来表示表的别名

部门数据权限注解

@DataScope(deptAlias = "d")
public List<...> select(...)
{
    
    
    return mapper.select(...);
}

部门及用户权限注解

@DataScope(deptAlias = "d", userAlias = "u")
public List<...> select(...)
{
    
    
    return mapper.select(...);
}

3、在mybatis查询底部标签添加数据范围过滤

<select id="select" parameterType="..." resultMap="...Result">
    <include refid="select...Vo"/>
    <!-- 数据范围过滤 -->
    ${params.dataScope}
</select>

例如:用户管理(未过滤数据权限的情况):

select u.user_id, u.dept_id, u.login_name, u.user_name, u.email
	, u.phonenumber, u.password, u.sex, u.avatar, u.salt
	, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by
	, u.create_time, u.remark, d.dept_name
from sys_user u
	left join sys_dept d on u.dept_id = d.dept_id
where u.del_flag = '0'

例如:用户管理(已过滤数据权限的情况):

select u.user_id, u.dept_id, u.login_name, u.user_name, u.email
	, u.phonenumber, u.password, u.sex, u.avatar, u.salt
	, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by
	, u.create_time, u.remark, d.dept_name
from sys_user u
	left join sys_dept d on u.dept_id = d.dept_id
where u.del_flag = '0'
	and u.dept_id in (
		select dept_id
		from sys_role_dept
		where role_id = 2
	)

结果很明显,我们多了如下语句。通过角色部门表(sys_role_dept)完成了数据权限过滤

and u.dept_id in (
	select dept_id
	from sys_role_dept
	where role_id = 2
)

逻辑实现代码 com.ruoyi.framework.aspectj.DataScopeAspect
具体的代码实现实在@DataScope中实现:
在这里插入图片描述
@DataScope定义在SysUserController当中

在这里插入图片描述
点击selectUserList(user)进入:

在这里插入图片描述
查看@DataScope的方法:
在这里插入图片描述

DataScope是若依自己定义的注解:

在这里插入图片描述

仅实体继承BaseEntity才会进行处理,SQL语句会存放到BaseEntity对象中的params属性中,然后在xml中通过${params.dataScope}获取拼接后的语句。
PS:如果是自己的业务表需要实现数据权限,需要有dept_id和user_id这两个字段。

4,使用效果

这里有一个总公司,深圳的业务前台
在这里插入图片描述
若依修改用户数据的权限可以在角色管理中进行修改
在这里插入图片描述
在角色管理中可以对权限进行修改 、角色管理中还涉及到分配用户。

使用不同权限用户名和密码可以登录不同角色,以深圳的SZ为例,登录之后只能够看到深圳总公司;只有市场部门权限的登录之后只能够看到市场部分;本部门数据权限只能看到本部门的,下面部门的数据看不到,本部门及以下数据权限可以看到部门以下的数据权限;仅本人的数据权限,只可以看到本人的,以user_only进行登录;以仅本人的数据权限进行登录,角色管理中可以看到分配用户;仅自己登录部门数据看不到,用户数据只能看到他自己的。
在这里插入图片描述

在这里插入图片描述


平庸的人用热闹填补空虚,优秀的人则用独处成就自己。


猜你喜欢

转载自blog.csdn.net/weixin_43025151/article/details/140611956