operation-log-permission-plan.md 6.8 KB

操作日志权限配置方案

概述

为操作日志模块增加完整的权限控制配置,包括API权限配置和数据库权限初始化。

1. 操作日志API权限配置

1.1 当前状态分析

  • 位置:src/server/api/operation-logs/index.ts
  • 当前配置:仅使用基础CRUD路由,无权限控制
  • 需要增加:细粒度的权限控制配置

1.2 权限配置更新

需要在 createCrudRoutes 中添加 permissions 参数:

const operationLogRoutes = createCrudRoutes({
  entity: OperationLog,
  createSchema: CreateOperationLogDto,
  updateSchema: UpdateOperationLogDto,
  getSchema: OperationLogSchema,
  listSchema: OperationLogSchema,
  searchFields: ['resourceType', 'action', 'endpoint', 'username', 'ipAddress'],
  middleware: [authMiddleware, enhancedPermissionWithLog],
  userTracking: {
    createdByField: 'userId',
    updatedByField: undefined
  },
  permissions: {
    create: ['system:log:create'],      // 创建操作日志
    read: ['system:log:view:all'],      // 查看所有操作日志
    update: ['system:log:update'],      // 更新操作日志
    delete: ['system:log:delete']       // 删除操作日志 
  }
});

2. 数据库权限配置

2.1 新增操作日志权限

需要在 docs/crm-permission-init.sql 中添加以下权限记录:

-- 操作日志管理权限
INSERT INTO permission (code, name, type, module, action, description, sort_order, is_active, parent_id) VALUES
('system:log:create', '创建操作日志', 'operation', 'system', 'log:create', '允许创建操作日志记录', 1010, 1, NULL),
('system:log:update', '编辑操作日志', 'operation', 'system', 'log:update', '允许编辑操作日志信息', 1020, 1, NULL),
('system:log:delete', '删除操作日志', 'operation', 'system', 'log:delete', '允许删除操作日志记录', 1030, 1, NULL),
('system:log:view:own', '查看个人操作日志', 'data', 'system', 'log:view', '仅查看自己创建的操作日志', 1041, 1, NULL),
('system:log:view:department', '查看部门操作日志', 'data', 'system', 'log:view', '查看所在部门操作日志', 1042, 1, NULL),
('system:log:view:sub_department', '查看部门及下级操作日志', 'data', 'system', 'log:view', '查看所在部门及下级部门操作日志', 1043, 1, NULL),
('system:log:view:all', '查看所有操作日志', 'data', 'system', 'log:view', '查看系统所有操作日志', 1044, 1, NULL);

2.2 为角色分配操作日志权限

超级管理员权限

-- 超级管理员拥有所有操作日志权限
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'COMPANY', NOW()
FROM role r, permission p
WHERE r.name = '超级管理员' AND p.code LIKE 'system:log:%';

系统管理员权限

-- 系统管理员拥有操作日志管理权限
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'COMPANY', NOW()
FROM role r, permission p
WHERE r.name = '系统管理员' AND p.code LIKE 'system:log:%';

部门经理权限

-- 部门经理查看部门及下级操作日志
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'SUB_DEPARTMENT', NOW()
FROM role r, permission p
WHERE r.name = '部门经理' 
  AND p.code IN ('system:log:view:sub_department', 'system:log:view:department', 'system:log:view:own');

销售经理权限

-- 销售经理查看部门操作日志
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'SUB_DEPARTMENT', NOW()
FROM role r, permission p
WHERE r.name = '销售经理' 
  AND p.code IN ('system:log:view:sub_department', 'system:log:view:department', 'system:log:view:own');

销售人员权限

-- 销售人员只查看个人操作日志
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'PERSONAL', NOW()
FROM role r, permission p
WHERE r.name = '销售人员' 
  AND p.code IN ('system:log:view:own');

访客权限

-- 访客只查看个人操作日志
INSERT INTO role_permission (role_id, permission_id, data_scope_type, created_at)
SELECT r.id, p.id, 'PERSONAL', NOW()
FROM role r, permission p
WHERE r.name = '访客' 
  AND p.code IN ('system:log:view:own');

3. 权限标识命名规范

3.1 权限分类

  • 操作权限system:log:create, system:log:update, system:log:delete
  • 数据权限system:log:view:own, system:log:view:department, system:log:view:sub_department, system:log:view:all

3.2 权限层级

  • 个人级:仅查看自己创建的操作日志
  • 部门级:查看所在部门创建的操作日志
  • 子部门级:查看所在部门及下级部门创建的操作日志
  • 公司级:查看所有操作日志

4. 前端集成

4.1 权限检查

前端页面需要根据权限标识控制按钮显示:

const { hasPermission } = usePermission();

// 检查是否有查看操作日志权限
const canViewLogs = hasPermission(['system:log:view:all', 'system:log:view:department', 'system:log:view:own']);

// 检查是否有删除操作日志权限
const canDeleteLogs = hasPermission(['system:log:delete']);

4.2 菜单权限

src/client/admin/menu.tsx 中添加权限检查:

{
  key: '/admin/logs',
  icon: <FileTextOutlined />,
  label: '操作日志',
  permissions: ['system:log:view:all', 'system:log:view:department', 'system:log:view:own']
}

5. 数据权限实现

5.1 数据权限规则

  • 个人级WHERE user_id = 当前用户ID
  • 部门级WHERE user_id IN (当前部门所有用户)
  • 子部门级WHERE user_id IN (当前部门及子部门所有用户)
  • 公司级:无额外过滤条件

5.2 实现方式

通过通用CRUD模块的权限系统自动处理数据权限过滤。

6. 实施步骤

步骤1:更新API路由

  1. 修改 src/server/api/operation-logs/index.ts
  2. 添加权限配置和中间件

步骤2:更新权限初始化脚本

  1. docs/crm-permission-init.sql 末尾添加操作日志权限
  2. 执行SQL脚本初始化权限数据

步骤3:验证权限配置

  1. 测试不同角色的权限访问
  2. 验证数据权限过滤效果
  3. 验证前端权限检查功能

7. 注意事项

  1. 向后兼容:添加权限配置不会影响现有功能
  2. 权限缓存:权限变更后需要重新登录生效
  3. 性能优化:为常用查询字段添加数据库索引
  4. 日志记录:所有权限检查失败的操作都会被记录

8. 测试用例

```sql -- 测试权限查询 SELECT r.name, p.code, rp.data_scope_type FROM role r JOIN role_permission rp ON r.id = rp.role_id JOIN permission p ON p.id = rp.permission_id WHERE p.code LIKE 'system:log:%' ORDER BY r.name, p.code;