当前位置: 首页 > news >正文

Ruoyi框架 | 扩展部门数据权限实现

一、背景与目标

在若依框架原有 DataScope 的基础上,实现一套独立的、基于部门层级的数据权限过滤机制,用于按组织结构灵活控制数据可见范围。

设计目标

  • 不依赖角色、不判断是否管理员

  • 通过注解参数动态控制数据范围

  • 支持:

    • 是否包含本部门
    • 向上查询 N 级部门
    • 向下查询 N 级部门 / 所有子部门
  • 与若依原有 BaseEntity + params + MyBatis XML 机制完全兼容


二、核心设计思路

1. 技术方案

  • 使用 AOP + 自定义注解 拦截查询方法

  • 在方法执行前:

    • 根据当前用户部门 ID
    • 动态拼接部门过滤 SQL
    • 注入到 BaseEntity.params.dataScope
  • Mapper XML 中通过 ${params.dataScope} 拼接 WHERE 条件

2. 依赖表结构(sys_dept)

dept_id     部门ID
parent_id   父部门ID
ancestors   祖先路径,如:0,1,3,10

三、自定义注解:ExtendedDataScope

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ExtendedDataScope {// 部门表别名(必填)String deptAlias() default "";// 用户表别名(预留扩展)String userAlias() default "";// 权限类型(当前主要使用 dept)String type() default "dept";// 向上级部门层数(0 = 不包含)int upLevel() default 0;// 向下级部门层数(0 = 不包含,999 = 所有子级)int downLevel() default 0;// 是否包含本部门boolean includeSelf() default true;
}

四、AOP 实现要点

1. 切面职责

  • 拦截所有标注 @ExtendedDataScope 的方法
  • 清空历史 dataScope,防止 SQL 注入
  • 生成部门层级 SQL
  • 写入 BaseEntity.params.dataScope

2. 核心处理流程

@Before├─ clearDataScope()├─ 获取当前用户├─ 读取注解参数├─ 构建部门范围 SQL└─ 写入 params.dataScope

五、部门层级 SQL 构建规则

1. 本部门

d.dept_id = {currentDeptId}

includeSelf = true 控制


2. 向上 N 级部门(upLevel)

原理:

  • 利用 ancestors 字段
  • 从 ancestors 中向前截取 N 个父级

示意 SQL:

d.dept_id IN (SELECT SUBSTRING_INDEX(SUBSTRING_INDEX(ancestors, ',', -(N + 1)), ',', 1)FROM sys_deptWHERE dept_id = 当前部门ID
)

3. 向下 N 级部门(downLevel)

3.1 所有子级(downLevel = 999)

d.dept_id IN (SELECT dept_id FROM sys_deptWHERE find_in_set(当前部门ID, ancestors)
)

3.2 限定层级子部门

思路:

  • 计算 ancestors 的层级深度(逗号个数)
  • 控制最大深度 = 当前深度 + N
d.dept_id IN (SELECT d.dept_idFROM sys_dept dWHERE find_in_set(当前部门ID, d.ancestors)AND 层级深度(d) <= 当前层级 + N
)

六、Mapper XML 使用方式

<select id="selectList" resultType="xxx">SELECT *FROM biz_table tLEFT JOIN sys_dept d ON t.dept_id = d.dept_id<where>1 = 1${params.dataScope}</where>
</select>

说明:

  • ${params.dataScope} 必须保留
  • AOP 动态注入 AND ( ... )

七、使用示例

@ExtendedDataScope(deptAlias = "d",includeSelf = true,upLevel = 1,downLevel = 2
)
public List<SysDept> selectDeptList(SysDept dept)
{return deptMapper.selectDeptList(dept);
}

含义说明

参数 含义
includeSelf 包含本部门
upLevel=1 包含上一级部门
downLevel=2 包含下两级部门
downLevel=999 包含所有子部门

八、方案特点总结

  • ✅ 与若依原生 DataScope 解耦
  • ✅ 仅依赖部门层级,不依赖角色权限
  • ✅ 控制粒度细,适合复杂组织结构
  • ✅ 非侵入式,Mapper 无需改动
  • ✅ 特别适合安全监管 / GIS / 组织树场景

九、可扩展方向(后续优化)

  • 使用 MySQL 8 / PostgreSQL 的 WITH RECURSIVE 优化层级查询
  • 部门层级缓存(Redis)减少子查询
  • 扩展到:部门 + 用户混合数据权限
  • 支持多部门归属(兼职部门)
http://www.jsqmd.com/news/177544/

相关文章:

  • YOLOFuse mathtype版本兼容性问题解决办法
  • YOLOFuse typora写博客引流策略:发布SEO优化文章吸引用户
  • YOLOFuse huggingface dataset加载自定义多模态数据
  • YOLOFuse双流融合策略对比:早期/中期/决策级融合怎么选?
  • WPF 自定义控件学习二,控件基础知识
  • YOLOFuse数据增强技术揭秘:多模态联合增广提升泛化能力
  • 配置STM32F411CEU6的系统时钟-避免芯片内核锁死
  • YOLOFuse faststone capture 滚动截图长网页操作指南
  • 支持FP8/AWQ/GPTQ量化导出!部署时模型体积缩小90%不丢精度
  • YOLOFuse多模态检测优势解析:低光、烟雾场景下的精度突破
  • 【Linux命令大全】001.文件管理之umask命令(实操篇)
  • YOLOFuse pid控制器联动设计:实时反馈调节检测频率
  • YOLOFuse markdown表格美化插件推荐
  • 【Linux命令大全】001.文件管理之whereis命令(实操篇)
  • [特殊字符] 快速提升工作效率的终端文本编辑器 - Fresh
  • YOLOFuse html meta标签优化SEO搜索引擎收录
  • 全链路压测中的数据隔离:关键策略与实践挑战
  • 导师严选2025 AI论文软件TOP10:本科生毕业论文写作全攻略
  • 【Linux命令大全】001.文件管理之which命令(实操篇)
  • 让游戏更真实的物理引擎,助力你的VR应用!
  • YOLOFuse中文文档优势:母语级说明更易理解
  • 每日互动(个推)用户运营便捷的平台助力头部直播APP智能预测用户流失倾向,用户留存提升15%
  • 云原生应用性能监控与测试一体化实践
  • [吾爱大神原创工具] python超超简单智能编译工具V9.1版(13.40更新万能拖功能)
  • YOLOFuse结合Typora写文档:高效记录实验过程与结果
  • YOLOFuse个人开发者扶持:小规模应用低成本接入
  • [Windows] 视频剪辑编辑软件中文绿色版ShotCut v25.12.31
  • YOLOFuse ultraiso注册码最新版安全性评估
  • YOLOFuse是否支持视频流输入?可通过修改infer_dual.py实现
  • YOLOFuse向后兼容政策:旧版本模型仍能正常加载