若依框架中如何实现数据权限区分

20人浏览 / 0人评论 / 添加收藏

在使用若依的框架时,我们常常会涉及到权限的管理问题。比如不同的角色,看到的数据不同。而这个数据权限,往往以部门为纬度进行划分。

如上图所示,可以查看全部数据、自定义数据、本部门数据、本部门及以下数据、仅限本人数据。

实现这个功能很简单,小编将对此功能进行一个介绍。接下来我们将深入分析若依数据权限@datascope (注解+AOP+动态sql拼接)

一、数据库mapper层修改。

这里咱们就以用户在查询用户时,即 selectUserList时所做的数据权限为例进行分析。

若依在进行数据权限的访问时,持久层(Mapper层)中对数据进行处理,根据用户角色的权限对数据进行过滤。

<select id="selectUserList" parameterType="SysUser" resultMap="SysUserResult">
  select u.user_id, u.dept_id, u.login_name, u.user_name, u.user_type, u.email, u.avatar, u.phonenumber, u.password, u.sex, u.salt, u.status, u.del_flag, u.login_ip, u.login_date, u.create_by, u.create_time, u.remark, d.dept_name, d.leader from sys_user u
  left join sys_dept d on u.dept_id = d.dept_id
  where u.del_flag = '0'
  <if test="userId != null and userId != 0">
     AND u.user_id = #{userId}
  </if>
  <if test="loginName != null and loginName != ''">
     AND u.login_name like concat('%', #{loginName}, '%')
  </if>
  <if test="status != null and status != ''">
     AND u.status = #{status}
  </if>
  <if test="phonenumber != null and phonenumber != ''">
     AND u.phonenumber like concat('%', #{phonenumber}, '%')
  </if>
  <if test="params.beginTime != null and params.beginTime != ''"><!-- 开始时间检索 -->
     AND date_format(u.create_time,'%y%m%d') >= date_format(#{params.beginTime},'%y%m%d')
  </if>
  <if test="params.endTime != null and params.endTime != ''"><!-- 结束时间检索 -->
     AND date_format(u.create_time,'%y%m%d') <= date_format(#{params.endTime},'%y%m%d')
  </if>
  <if test="deptId != null and deptId != 0">
     AND (u.dept_id = #{deptId} OR u.dept_id IN ( SELECT t.dept_id FROM sys_dept t WHERE FIND_IN_SET (#{deptId},ancestors) ))
  </if>
  <!-- 数据范围过滤 -->
  ${params.dataScope}

</select> 
 

我们可以看到倒数第二行${params.dataScope}就是对数据范围进行过滤

其中,params指的是parameterType="SysUser"传来的参数 SysUse的一个属性,然后这个属性的dataScope属性。

我们可以看到SysUser继承了BaseEntity,我们在BaseEntity这个类中发现了 params 这个属性。

 

二、在controller层或者service层进行标注。

我们继续探究这个注解是怎么执行的。在controller层或者service层进行标注都是可以的。

我们可以发现在 SysUserServiceImpl Service业务层实现类中发现 @DataScope 的使用。

@DataScope(deptAlias = "d", userAlias = "u")
public List<SysUser> selectUserList(SysUser user)
{
   return userMapper.selectUserList(user);
}

主要是标红部分的文字,需要对照着修改即可实现数据权限区分的功能。希望对您能有所启发。

全部评论