Files
hzdyjs/docs/变更管理/code-adjust-record-2025-08-01-approval-permission-analysis.md
T
2025-07-30 23:24:43 +08:00

4.8 KiB
Raw Blame History

部门审批管理页面权限逻辑分析记录

变更时间: 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. 当前权限实现状态

✅ 已实现的权限控制

  1. 菜单权限控制: 使用 @SaCheckPermission 注解控制菜单访问
  2. 审批权限验证: checkApprovalPermission() 方法验证用户是否有审批权限
  3. 部门审批专用接口: queryDeptPendingApprovals() 方法查询部门待审批

❌ 缺失的权限控制

  1. 数据权限过滤: 没有基于用户角色的数据过滤
  2. 超级管理员特权: 没有区分超级管理员和普通用户的数据访问权限
  3. 部门数据隔离: 没有实现部门领导只能看到本部门数据

3. 权限逻辑对比

期望的权限逻辑

超级管理员 → 查看所有待审批记录
部门领导 → 只查看本部门用户提交的审批

当前的权限逻辑

所有用户 → 查看所有待审批记录(无数据权限过滤)

🚨 问题确认

权限逻辑不符合要求

根据代码分析,当前的部门审批管理页面权限逻辑不符合要求:

  1. ❌ 超级管理员: 没有特殊权限,与其他用户一样
  2. ❌ 部门领导: 没有部门数据隔离,可以看到所有数据
  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: 立即修复

  1. 添加数据权限过滤逻辑
  2. 区分超级管理员和普通用户权限
  3. 实现部门数据隔离

优先级2: 完善功能

  1. 添加数据权限注解
  2. 优化查询性能
  3. 添加权限日志记录

✅ 总结

当前权限逻辑不符合要求,需要立即进行以下修复:

  1. 添加数据权限过滤机制
  2. 实现超级管理员特权
  3. 实现部门领导数据隔离
  4. 完善权限控制文档

建议采用方案1,在Service层添加数据权限过滤逻辑,确保权限控制符合业务需求。