【若依】8、数据权限
SpringSecurity
有一个数据权限的注解 @PostFilter
;它是从数据库中取到全部数据后,再进行过滤,这样做的效率太低;
MyBatisPlus
官网
简介 | MyBatis-Plus CRUD created_time updated_time version deleted 代码生成
源码
自定义注解 @DataScope
用法:
IDEA快捷键:Win:Ctrl+Alt+F7,Mac:Cmd+Opt+F7
- 查询部门
- 查询角色
- 查询用户
数据权限:
- 全部数据权限
- 自定义数据权限
- 本部门数据权限
- 本部门及以下数据权限
- 只能查看自己的数据
思路: 根据不同的数据权限来改变SQL语句不同的部分
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
-- 不同数据权限SQL语句相同的部分
-- 查询部门
SELECT *
FROM sys_dept d
WHERE d.del_flag='0'
-- 查询角色
SELECT r.*
FROM sys_role r
LEFT JOIN sys_user_role ur ON r.role_id = ur.role_id
LEFT JOIN sys_user u ON ur.user_id = u.user_id
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
WHERE r.del_flag='0'
-- 查询用户
SELECT u.*
FROM sys_user u
LEFT JOIN sys_dept d ON u.dept_id = d.dept_id
WHERE u.del_flag = '0'
-- 不同数据权限SQL语句不同的部分
-- 全部数据权限
-- 自定义数据权限
AND d.dept_id IN (SELECT rd.dept_id FROM sys_role_dept rd WHERE rd.role_id = 2)
-- 本部门数据权限
AND d.dept_id = 101
-- 本部门及以下数据权限
AND d.dept_id IN (SELECT dept_id FROM sys_dept WHERE dept_id = 101 OR FIND_IN_SET(101, ancestors))
-- 只能查看自己的数据
AND u.user_id = 2
1
2
-- str 包含的字符串,strlist 列名
FIND_IN_SET(str, strlist)
缺点:与业务高度耦合 部门别名 用户别名
源码
本文由作者按照
CC BY 4.0
进行授权