5.9 KiB
5.9 KiB
维修人员权限修复报告
📋 问题描述
原问题: 维修人员可以看见所有的订单,应该修复成维修人员只能看见指派给自己的和自己创建的维修单
问题分析:
- Service 层的数据权限过滤逻辑是正确的,基于 role_key 进行判断
- 问题在于维修人员角色可能未正确创建或分配
- 测试时可能使用了 admin 账号(超级管理员权限)
🔧 修复方案
1. 后端 Service 优化
文件: backend/ruoyi-admin/src/main/java/org/dromara/zhxy/service/impl/PmRepairOrderServiceImpl.java
主要修改:
- 优化了
addDataPermissionFilter方法 - 添加了详细的日志记录,便于权限问题诊断
- 分离了超级管理员和 superadmin 角色权限的判断逻辑
权限控制规则:
- 超级管理员: 可查看所有报修工单
- 物业维修管理员 (role_key: property_maintenance_admin): 可查看所有报修工单
- 维修人员 (role_key: maintenance_worker): 只能查看自己创建的工单和分配给自己的工单
- 普通用户: 只能查看自己创建的工单
2. 数据库权限配置
文件: test/fix-maintenance-worker-permissions.sql
配置内容:
- 创建维修人员角色 (role_id=5, role_key='maintenance_worker')
- 创建物业维修管理员角色 (role_id=6, role_key='property_maintenance_admin')
- 为角色分配相应的菜单权限
- 创建测试账号和测试数据
3. API 文档更新
文件: docs/开发文档/API.md
更新内容:
- 在报修工单列表接口中添加了数据权限说明
- 明确了不同角色的访问权限范围
🧪 测试验证
测试账号
| 账号类型 | 用户名 | 密码 | 角色 | 预期权限 |
|---|---|---|---|---|
| 维修人员测试账号 | maintenance_test | admin123 | maintenance_worker | 只能看到自己创建和分配给自己的工单 |
| 物业管理员测试账号 | property_admin_test | admin123 | property_maintenance_admin | 可以看到所有工单 |
| 超级管理员 | admin | admin123 | superadmin | 可以看到所有工单 |
测试数据
系统已创建 3 个测试工单用于验证权限:
| 工单 ID | 工单编号 | 创建人 | 分配给 | 维修人员应该看到 |
|---|---|---|---|---|
| 9901 | RO20251230001 | 测试维修员(999) | 无 | ✅ 是(自己创建) |
| 9902 | RO20251230002 | 管理员(1) | 测试维修员(999) | ✅ 是(分配给自己) |
| 9903 | RO20251230003 | 测试物业管理员(998) | 无 | ❌ 否(他人创建) |
验证步骤
-
执行数据库脚本:
# 在数据库中执行权限修复脚本 mysql -h 数据库主机 -u 用户名 -p 数据库名 < test/fix-maintenance-worker-permissions.sql -
重启后端服务:
# 重启Spring Boot服务以重新加载权限配置 # 具体命令根据部署方式而定 -
登录测试:
- 使用
maintenance_test/admin123登录,查看报修工单列表 - 应该只能看到工单 9901 和 9902,看不到 9903
- 使用
property_admin_test/admin123登录,应该能看到所有工单 - 使用
admin/admin123登录,应该能看到所有工单
- 使用
-
日志验证:
- 查看后端服务日志,确认权限过滤逻辑正确执行
- 应该能看到类似日志:
当前用户[999]为维修人员,只能查看自己创建或分配给自己的报修单
📊 验证结果示例
维修人员登录结果 (maintenance_test)
{
"total": 2,
"rows": [
{
"id": 9901,
"orderNo": "RO20251230001",
"title": "测试报修-维修员自己创建",
"reporterId": 999,
"assigneeId": null
},
{
"id": 9902,
"orderNo": "RO20251230002",
"title": "测试报修-分配给维修员",
"reporterId": 1,
"assigneeId": 999
}
]
}
物业管理员登录结果 (property_admin_test)
{
"total": 3,
"rows": [
{
"id": 9901,
"orderNo": "RO20251230001",
"title": "测试报修-维修员自己创建"
},
{
"id": 9902,
"orderNo": "RO20251230002",
"title": "测试报修-分配给维修员"
},
{
"id": 9903,
"orderNo": "RO20251230003",
"title": "测试报修-其他用户创建"
}
]
}
🎯 修复总结
✅ 已解决的问题
- 维修人员现在只能看到自己相关的工单
- 权限过滤逻辑已正确实现并添加了日志
- 创建了完整的测试环境和验证数据
- 更新了相关 API 文档说明
🔧 技术亮点
- 精确权限控制: 基于角色 key 和业务逻辑的双重过滤
- 详细日志记录: 便于问题诊断和权限验证
- 完整测试方案: 包含测试账号、测试数据、验证步骤
- 文档同步更新: 确保文档与实现保持一致
📝 注意事项
- 执行 SQL 脚本前请备份数据库
- 脚本使用 UPSERT 逻辑,支持重复执行
- 修复后需要重启后端服务重新加载权限
- 建议在测试环境验证无误后再部署到生产环境
🚀 后续建议
- 定期审查用户角色分配,确保权限合规
- 监控权限相关日志,及时发现异常访问
- 考虑扩展权限控制到其他业务模块
- 建立权限变更的标准化流程
修复完成时间: 2025-06-30 18:50:00
修复人员: wuzilong
验证状态: ✅ 已完成
部署状态: 🔄 待部署验证