文章

【若依】8、数据权限

SpringSecurity 有一个数据权限的注解 @PostFilter;它是从数据库中取到全部数据后,再进行过滤,这样做的效率太低;

MyBatisPlus

官网

简介 | MyBatis-Plus CRUD created_time updated_time version deleted 代码生成

源码

yueyazhui/learn_mybatisplus

自定义注解 @DataScope

用法:

IDEA快捷键:Win:Ctrl+Alt+F7,Mac:Cmd+Opt+F7

  1. 查询部门
  2. 查询角色
  3. 查询用户

数据权限:

  1. 全部数据权限
  2. 自定义数据权限
  3. 本部门数据权限
  4. 本部门及以下数据权限
  5. 只能查看自己的数据

思路: 根据不同的数据权限来改变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)

缺点:与业务高度耦合 部门别名 用户别名

源码

yueyazhui/ruoyi_data_scope

本文由作者按照 CC BY 4.0 进行授权