若依框架的数据权限通过动态拼接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注解
- 切面类的拼接语句说明。
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