Files
zyt/admin/ORDER_PERMISSION_CONTROL.md
T
2026-03-11 14:33:49 +08:00

4.3 KiB
Raw Blame History

订单系统 - 权限控制实现

功能说明

订单列表现已实现权限控制:

  • 主管: 可以查看所有订单
  • 普通员工: 只能查看自己创建的订单

实现原理

权限检查方法

OrderLists 中添加了 filterByPermission() 方法,支持超管、主管和普通员工三个权限级别:

/**
 * @notes 权限过滤 - 普通员工只能看自己创建的订单
 * @param array $where
 * @return void
 */
private function filterByPermission(array &$where): void
{
    // 检查是否是超管(root字段为1)
    if (!empty($this->adminInfo['root']) && $this->adminInfo['root'] == 1) {
        // 超管不过滤,可以看所有订单
        return;
    }
    
    // 主管角色ID列表(可根据实际调整)
    $supervisorRoles = [0, 3];
    
    // 检查当前用户是否是主管
    $roleIds = AdminRole::where('admin_id', $this->adminId)->column('role_id');
    
    // 如果不是主管,只能看自己创建的订单
    $isSupervisor = count(array_intersect($roleIds, $supervisorRoles)) > 0;
    
    if (!$isSupervisor) {
        $where[] = ['creator_id', '=', $this->adminId];
    }
}

调用位置

lists()count() 方法中都调用了权限检查:

public function lists(): array
{
    $where = $this->searchWhere;
    
    // 权限控制:普通员工只能看自己创建的订单
    $this->filterByPermission($where);
    
    // ... 其他查询逻辑
}

public function count(): int
{
    $where = $this->searchWhere;
    
    // 权限控制:普通员工只能看自己创建的订单
    $this->filterByPermission($where);
    
    // ... 其他查询逻辑
}

角色配置

超管

  • 标识: root 字段 = 1
  • 权限: 查看所有订单(不过滤)

主管角色(支持多个)

  • 角色ID: 0, 3(可根据实际调整)
  • 权限: 查看所有订单

普通员工角色

  • 角色ID: 其他(如 2, 4 等)
  • 权限: 只能查看自己创建的订单

权限检查流程

  1. 检查是否是超管 → 如果是,不过滤,返回所有订单
  2. 检查是否是主管 → 如果是,不过滤,返回所有订单
  3. 普通员工 → 过滤,只返回自己创建的订单

自定义配置

修改主管角色ID

如果你的系统中主管角色ID不同,需要修改 filterByPermission() 方法中的 $supervisorRoles 数组:

// 修改这一行
$supervisorRoles = [0, 3];  // 主管角色ID列表

// 改为你的实际角色ID,例如:
$supervisorRoles = [2, 5];  // 你的主管角色ID列表

支持任意数量的主管角色,只需添加到数组中即可。

超管字段

超管通过 adminInfo['root'] 字段判断,值为 1 表示超管。这个字段来自 Admin 模型的 root 属性。


数据库关系

角色关联表 (zyt_admin_role)

admin_id: 管理员ID
role_id: 角色ID

订单表 (la_order)

creator_id: 创建人ID(管理员ID

工作流程

普通员工查看订单列表

  1. 发送请求获取订单列表
  2. 系统检查当前用户角色
  3. 如果不是主管,添加过滤条件 creator_id = 当前用户ID
  4. 返回该员工创建的订单

主管查看订单列表

  1. 发送请求获取订单列表
  2. 系统检查当前用户角色
  3. 如果是主管,不添加过滤条件
  4. 返回所有订单

测试步骤

测试普通员工权限

  1. 以普通员工账号登录
  2. 访问订单列表
  3. 验证只显示该员工创建的订单

测试主管权限

  1. 以主管账号登录
  2. 访问订单列表
  3. 验证显示所有订单

相关文件

  • server/app/adminapi/lists/order/OrderLists.php - 订单列表(权限控制实现)
  • server/app/common/model/auth/AdminRole.php - 管理员角色关联模型
  • server/app/common/model/Order.php - 订单模型

注意事项

  1. 角色ID配置: 确保主管角色ID与系统实际配置一致
  2. 权限验证: 权限检查在列表查询时进行,不影响其他操作
  3. 性能考虑: 权限检查使用简单的 WHERE 条件,性能影响最小
  4. 安全性: 权限检查在后端进行,前端无法绕过

版本信息

  • 实现版本: 1.3.0
  • 实现日期: 2026-03-10
  • 功能类型: 权限控制
  • 状态: 完成

实现完成