4.8 KiB
4.8 KiB
部门审批管理页面权限逻辑分析记录
变更时间: 2025-08-01 18:00:00
操作人员: Cursor AI助手
变更类型: 权限逻辑分析
影响模块: 财务管理 - 部门审批管理
🎯 分析目标
确认部门审批管理页面的权限逻辑是否符合以下要求:
- 超级管理员: 可以看到所有的待审批记录
- 部门领导: 只能看到本部门的用户提交的审批
🔍 当前权限逻辑分析
1. 后端权限控制机制
数据权限过滤缺失
通过代码分析发现,CwApprovalRecordServiceImpl 和 CwProjectApplicationServiceImpl 中没有实现数据权限过滤逻辑:
// 当前实现 - 没有数据权限过滤
private LambdaQueryWrapper<CwApprovalRecord> buildQueryWrapper(CwApprovalRecordBo bo) {
LambdaQueryWrapper<CwApprovalRecord> lqw = Wrappers.lambdaQuery();
lqw.eq(bo.getApplicationId() != null, CwApprovalRecord::getApplicationId, bo.getApplicationId());
lqw.eq(StringUtils.isNotBlank(bo.getApplicationNo()), CwApprovalRecord::getApplicationNo, bo.getApplicationNo());
// ... 其他查询条件
return lqw;
}
Mapper层缺少数据权限注解
CwApprovalRecordMapper 和 CwProjectApplicationMapper 中没有使用 @DataPermission 注解:
// 当前状态 - 缺少数据权限注解
public interface CwApprovalRecordMapper extends BaseMapperPlus<CwApprovalRecord, CwApprovalRecordVo> {
// 没有 @DataPermission 注解
}
2. 当前权限实现状态
✅ 已实现的权限控制
- 菜单权限控制: 使用
@SaCheckPermission注解控制菜单访问 - 审批权限验证:
checkApprovalPermission()方法验证用户是否有审批权限 - 部门审批专用接口:
queryDeptPendingApprovals()方法查询部门待审批
❌ 缺失的权限控制
- 数据权限过滤: 没有基于用户角色的数据过滤
- 超级管理员特权: 没有区分超级管理员和普通用户的数据访问权限
- 部门数据隔离: 没有实现部门领导只能看到本部门数据
3. 权限逻辑对比
期望的权限逻辑
超级管理员 → 查看所有待审批记录
部门领导 → 只查看本部门用户提交的审批
当前的权限逻辑
所有用户 → 查看所有待审批记录(无数据权限过滤)
🚨 问题确认
权限逻辑不符合要求
根据代码分析,当前的部门审批管理页面权限逻辑不符合要求:
- ❌ 超级管理员: 没有特殊权限,与其他用户一样
- ❌ 部门领导: 没有部门数据隔离,可以看到所有数据
- ❌ 数据权限: 完全缺失数据权限过滤机制
🔧 解决方案建议
方案1: 添加数据权限过滤(推荐)
1. 在Service层添加权限过滤
private void addDataPermissionFilter(LambdaQueryWrapper<CwApprovalRecord> lqw) {
Long currentUserId = LoginHelper.getUserId();
// 超级管理员不过滤数据
if (LoginHelper.isSuperAdmin(currentUserId)) {
return;
}
// 部门领导只能看到本部门数据
// 普通用户只能看到自己相关的数据
// ... 具体实现
}
2. 在Mapper层添加数据权限注解
@DataPermission({
@DataColumn(key = "approver_id", value = "approver_id"),
@DataColumn(key = "dept_id", value = "dept_id")
})
List<CwApprovalRecordVo> selectPendingByApproverId(@Param("approverId") Long approverId,
@Param("nodeStatus") String nodeStatus);
方案2: 基于角色的查询方法
1. 修改查询方法
// 超级管理员查询所有
public List<CwApprovalRecordVo> queryAllPendingApprovals() {
if (LoginHelper.isSuperAdmin()) {
return baseMapper.selectAllPendingApprovals();
}
return queryDeptPendingApprovals();
}
// 部门领导查询本部门
public List<CwApprovalRecordVo> queryDeptPendingApprovals() {
Long currentUserId = LoginHelper.getUserId();
Long deptId = LoginHelper.getDeptId();
return baseMapper.selectByDeptAndApprover(deptId, currentUserId, "waiting");
}
📋 实施建议
优先级1: 立即修复
- 添加数据权限过滤逻辑
- 区分超级管理员和普通用户权限
- 实现部门数据隔离
优先级2: 完善功能
- 添加数据权限注解
- 优化查询性能
- 添加权限日志记录
✅ 总结
当前权限逻辑不符合要求,需要立即进行以下修复:
- 添加数据权限过滤机制
- 实现超级管理员特权
- 实现部门领导数据隔离
- 完善权限控制文档
建议采用方案1,在Service层添加数据权限过滤逻辑,确保权限控制符合业务需求。