若依数据权限控制

若依框架的数据权限通过动态拼接sql可以实现非常方便的数据过滤。但是新手直接去看切面类可能有点不是很明晰,这里针对直接使用或者学习若依动态数据过滤的同志出一下使用流程。

1.角色管理设置数据范围类型

首先,我们看到系统管理-角色管理这里有一个“数据权限”按钮,点击后,看到数据范围可以设置5类数据权限。
在这里插入图片描述
2. 机构管理树形列表
其次,我们看到系统管理-机构管理这里有机构树形结构列表。(在数据过滤里,树形结构用于查看本部门及以下数据权限的时候获取树当前节点机构和其叶子节点机构)
这里只是说明一下,
在这里插入图片描述

3. 若依系统自带切面类DataScopeAspect.java
然后,打开com-framework-aspecttj下的DataScopeAspect.java文件 的dataScopeFilter类
sqlString.append()将要切入的sql加入

 public static void dataScopeFilter(JoinPoint joinPoint, SysUser user, String deptAlias, String userAlias)
    {
        StringBuilder sqlString = new StringBuilder();
 
        for (SysRole role : user.getRoles())
        {
            String dataScope = role.getDataScope();
            if (DATA_SCOPE_ALL.equals(dataScope))
            {
                sqlString = new StringBuilder();
                break;
            }
            else if (DATA_SCOPE_CUSTOM.equals(dataScope))
            {
                sqlString.append(StringUtils.format(
                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_role_dept WHERE role_id = {} ) ", deptAlias,
                        role.getRoleId()));
            }
            else if (DATA_SCOPE_DEPT.equals(dataScope))
            {
                sqlString.append(StringUtils.format(" OR {}.dept_id = {} ", deptAlias, user.getDeptId()));
            }
            else if (DATA_SCOPE_DEPT_AND_CHILD.equals(dataScope))
            {
                sqlString.append(StringUtils.format(
                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
                        deptAlias, user.getDeptId(), user.getDeptId()));
            }
            else if (DATA_SCOPE_SELF.equals(dataScope))
            {
                if (StringUtils.isNotBlank(userAlias))
                {
                    sqlString.append(StringUtils.format(" OR {}.user_id = {} ", userAlias, user.getUserId()));
                }
                else
                {
                    // 数据权限为仅本人且没有userAlias别名不查询任何数据
                    sqlString.append(" OR 1=0 ");
                }
            }
        }

4. 使用步骤。

首先,在你当前模块的Mybatic.xml文件里面的id= selectxxList 的sql语句的后面加上**${params.dataScope}**。注意是加在where 条件部分,写错也没事,就是想要节省大家的调试时间。
在这里插入图片描述
其次,在当前模块的接口类selectxxList()方法前加上
@DataScope注解
在这里插入图片描述
在这里插入图片描述

  1. 切面类的拼接语句说明。
csharp
 sqlString.append(StringUtils.format(
                        " OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",
                        deptAlias, user.getDeptId(), user.getDeptId()));

上面代码中的" OR {}.dept_id IN ( SELECT dept_id FROM sys_dept WHERE dept_id = {} or find_in_set( {} , ancestors ) )",这一串即要拼接在你要控制的模块的Mybatic.xml文件里面的id= selectxxList 的sql语句的后面的sql语句。
//其中第一个OR {}的大括号取值是deptAlias,也就是你在在当前模块的接口类selectxxList()方法前加上 @DataScope注解@DataScope(deptAlias="XX",...)中赋值的XX,注意赋值的XX应该和你Mybatic.xml文件里面的id= selectxxList 的sql语句查找的表名或者别名一致。
//第二和第三个 {}的大括号取值是都是user.getDeptId(), user.getDeptId(),系统会自动获取用户的DeptId.

说明:使用单体版Ruoyi

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值