数据权限
2025年2月23日大约 2 分钟开发指南数据权限
提示
数据权限是指用户在系统中对数据的访问权限。通过数据权限,可以实现对用户访问数据的控制,保证数据的安全性。
实现原理
通过自定义拦截器实现 DataPermissionHandler
接口。在 youlai-boot 中,MyDataPermissionHandler
是其具体实现类,用于在 SQL 执行前动态拼接权限过滤条件。 处理逻辑如下:
- 获取用户权限范围(如部门或用户)。
- 动态生成筛选条件:如部门及以下的
dept_id IN (...)
或个人创建的create_by = ...
。 - 将条件追加到原始 SQL 的
WHERE
子句。
使用示例
在数据持久层的方法中,如果需要实现数据权限控制,可以直接在方法上添加 @DataPermission
注解。
UserMapper.java
@Mapper
public interface UserMapper {
@DataPermission(
deptAlias = "u", // 部门字段的表别名,用于标记 SQL 中部门字段的来源表
deptIdColumnName = "dept_id", // 部门字段的列名,默认为 dept_id
userAlias = "u", // 用户字段的表别名,用于标记 SQL 中用户字段的来源表
userIdColumnName = "create_by" // 用户字段的列名,默认为 create_by
)
Page<UserBO> getUserPage(Page<UserBO> page, UserPageQuery queryParams);
}
UserMapper.xml
<select id="getUserPage">
SELECT
u.id,
u.username,
u.nickname,
u.dept_id
FROM
sys_user u
WHERE
u.is_deleted = 0
</select>
动态 SQL 示例:
权限范围:部门及以下
SELECT u.id, u.username, u.nickname, u.dept_id FROM sys_user u WHERE u.is_deleted = 0 AND u.dept_id IN (SELECT id FROM sys_dept WHERE id = 3 OR FIND_IN_SET(3, tree_path));
其中
AND u.dept_id IN (SELECT id FROM sys_dept WHERE id = 3 OR FIND_IN_SET(3, tree_path))
是MyDataPermissionHandler
根据用户权限为“部门及以下”动态追加的筛选条件。权限范围:本人创建
SELECT u.id, u.username, u.nickname, u.dept_id FROM sys_user u WHERE u.is_deleted = 0 AND u.create_by = 2;
其中:
AND u.create_by = 2
是MyDataPermissionHandler
根据用户权限为“本人创建”动态追加的筛选条件。