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

如上图所示,可以查看全部数据、自定义数据、本部门数据、本部门及以下数据、仅限本人数据。
实现这个功能很简单,小编将对此功能进行一个介绍。接下来我们将深入分析若依数据权限@datascope (注解+AOP+动态sql拼接)。
这里咱们就以用户在查询用户时,即 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);
}
主要是标红部分的文字,需要对照着修改即可实现数据权限区分的功能。希望对您能有所启发。

全部评论