需求
为了增强程序的安全性,需要在用户访问数据库的时候进行权限判断后选择性进行判断是否需要增强sql,来达到限制低级别权限用户访问数据的目的.
根据业务需要,这里将角色按照数据范围做权限限定.比如,角色如下:
编号
名称
描述
1
管理员
全部数据权限
2
普通角色
自定义数据权限
3
部门权限
部门权限
4
部门及以下数据权限
部门及以下数据权限
5
本人数据
本人数据
部门如下:
编号
父id
名称
描述
1
0
北京总公司
101
1
北京公司1
102
1
北京公司2
10101
101
丰台公司1
10102
101
丰台公司2
10201
102
昌平公司1
10202
102
昌平公司2
思路:
- 可以模仿 PageHelper.startPage 用来声明哪些操作需要做范围限制
- 定义 Mybatis plus自定义拦截器Interceptor,用于每次拦截查询sql语句,附带数据范围权限sql条件
- 因为使用了 PageHelper.startPage 分页插件的使用,先计算总数,怎么在这之前拦截,需要拦截多次
- 考虑到Mybatis拦截器能够拦截SQL执行的整个过程,因为我们可以考虑SQL执行之前,对SQL进行重写,从而达到数据行权限的目的。
步骤:
-
声明datescope
protected static final ThreadLocal threadLocal = new ThreadLocal();
/**- 设置权限标识
/
public static void startDataScope(){
threadLocal.set(SecurityConstants.DATA_SCOPE);
}
/* - 获取权限标识
/
public static String getDataScope(){
return threadLocal.get();
}
/* - 清除权限标识
*/
public static void cleanDataScope(){
threadLocal.remove();
}
复制代码
- 设置权限标识
-
定义 Mybatis plus自定义拦截器
/**
-
@author zhc
-
@description 数据权限插件
-
@date 2022-04-01 17:03
*/
-