前言
在企业级系统开发中,数据权限是比菜单权限更核心的安全控制能力。简单来说:
菜单权限控制“能不能进这个页面”
数据权限控制“进了页面后,能看到哪些具体数据”
本文基于若依(RuoYi)框架,带领大家从零实现一个车间设备数据按部门隔离的功能。最终效果是:不同部门的用户登录系统后,只能查看本部门的设备数据,而超级管理员可以查看全部设备数据。
一、需求分析
- 功能:车间设备管理,支持列表查询、数据权限过滤
- 权限规则:
- 普通用户:仅查看本部门设备
- 超级管理员:查看全部设备
- 设备号:固定为
sxy_001 - 技术:若依框架 + MySQL + MyBatis + AOP 数据权限
二、数据库表设计
创建车间设备表 sys_device,字段包含设备编号、温度、所属部门、删除标志等。
CREATE TABLE `sys_device` ( `id` bigint NOT NULL AUTO_INCREMENT COMMENT '记录编号', `device_code` varchar(64) NOT NULL COMMENT '设备号', `temperature` int DEFAULT NULL COMMENT '温度', `dept_id` bigint NOT NULL COMMENT '部门编号(车间)', `del_flag` char(1) DEFAULT '0' COMMENT '删除标志(0代表存在 2代表删除)', `create_by` varchar(64) DEFAULT '' COMMENT '创建者', `create_time` datetime DEFAULT NULL COMMENT '创建时间', `update_by` varchar(64) DEFAULT '' COMMENT '更新者', `update_time` datetime DEFAULT NULL COMMENT '更新时间', `remark` varchar(500) DEFAULT NULL COMMENT '备注', PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COMMENT='车间设备表';三、菜单设计
在系统工具 - 代码生成中生成车间设备表
点击生成代码,之后便可以在系统工具菜单下找到
四、权限设计:创建测试用户并分配权限
新增用户
权限修改
五、后端代码修改:启用若依数据权限注解
若依框架提供了强大的@DataScope注解,配合 MyBatis 的 SQL 拦截器,可以很方便地实现数据行级别的过滤。
1. Service 层添加注解
找到ruoyi-system/src/main/java/com/ruoyi/system/service/impl/SysDeviceServiceImpl.java中的列表查询方法,添加@DataScope注解。
@Override @DataScope(deptAlias = "d", userAlias = "u") // 添加此行 public List<SysDevice> selectSysDeviceList(SysDevice sysDevice) { return sysDeviceMapper.selectSysDeviceList(sysDevice); }2. Mapper XML 注入数据权限 SQL
找到ruoyi-system/src/main/resources/mapper/system/SysDeviceMapper.xml中的selectSysDeviceList查询,在 where 条件末尾添加${params.dataScope}
<select id="selectSysDeviceList" parameterType="SysDevice" resultMap="SysDeviceResult"> <include refid="selectSysDeviceVo"/> <where> d.del_flag = '0' <if test="deviceCode != null and deviceCode != ''"> and d.device_code = #{deviceCode}</if> <if test="temperature != null"> and d.temperature = #{temperature}</if> <if test="deptId != null"> and d.dept_id = #{deptId}</if> <!-- ⭐ 数据权限过滤:关键行 --> ${params.dataScope} </where> </select>五、最终效果展示
场景一:超级管理员 admin 登录
可以查看所有设备记录
场景二:普通用户
只能查看部门设备记录