charging-cabinet/tasks/005-permission-system.md
2026-07-02 05:38:01 +08:00

4.6 KiB
Raw Blame History

任务005权限系统

目标

实现RBAC权限控制精确到按钮级别。

权限模型

角色

  • 总管理员 — 全部权限,管理所有组织/项目/设备
  • 企业管理员 — 只能管理自己组织下的项目/设备/人员
  • 普通用户 — 根据配置查看/操作特定组织/项目/设备

权限粒度

  • 组织级 — 用户可看/操作整个组织下所有设备
  • 项目级 — 用户只能看/操作某项目下的设备
  • 设备级 — 用户只能看/操作某一台柜子

权限类型

  • view — 查看
  • operate — 操作(控制设备)

数据库表

-- 角色表
CREATE TABLE roles (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(50) NOT NULL UNIQUE,
    description VARCHAR(200),
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 权限表
CREATE TABLE permissions (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    code VARCHAR(50) NOT NULL UNIQUE COMMENT '权限码如device:view',
    name VARCHAR(100) NOT NULL,
    created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 角色权限关联表
CREATE TABLE role_permissions (
    role_id BIGINT NOT NULL,
    permission_id BIGINT NOT NULL,
    PRIMARY KEY (role_id, permission_id),
    FOREIGN KEY (role_id) REFERENCES roles(id),
    FOREIGN KEY (permission_id) REFERENCES permissions(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 用户角色关联表
CREATE TABLE user_roles (
    user_id BIGINT NOT NULL,
    role_id BIGINT NOT NULL,
    PRIMARY KEY (user_id, role_id),
    FOREIGN KEY (user_id) REFERENCES users(id),
    FOREIGN KEY (role_id) REFERENCES roles(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

-- 用户权限范围表(组织/项目/设备级)
CREATE TABLE user_scopes (
    id BIGINT AUTO_INCREMENT PRIMARY KEY,
    user_id BIGINT NOT NULL,
    scope_type TINYINT NOT NULL COMMENT '1组织 2项目 3设备',
    scope_id BIGINT NOT NULL,
    permission_type TINYINT NOT NULL COMMENT '1查看 2操作',
    FOREIGN KEY (user_id) REFERENCES users(id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

后端API

角色管理

GET    /api/roles              # 角色列表
POST   /api/roles              # 创建角色
PUT    /api/roles/:id          # 更新角色
DELETE /api/roles/:id          # 删除角色
PUT    /api/roles/:id/permissions  # 设置角色权限

用户权限

GET    /api/users/:id/permissions   # 获取用户权限
PUT    /api/users/:id/roles         # 设置用户角色
PUT    /api/users/:id/scopes        # 设置用户权限范围

权限校验中间件

// 路由级别权限校验
#[middleware]
fn require_permission(permission: &str) {
    // 1. 从token获取用户ID
    // 2. 查询用户角色和权限
    // 3. 校验权限范围(组织/项目/设备)
    // 4. 无权限返回403
}

前端组件

权限组件

// 按钮级权限控制
<Permission code="device:operate">
  <Button>开始充电</Button>
</Permission>

// 页面级权限控制
<RequirePermission code="energy:view">
  <EnergyPage />
</RequirePermission>

角色管理页

  • 角色列表
  • 创建/编辑角色
  • 权限树勾选(按模块分组)

用户权限配置

  • 选择角色
  • 配置权限范围(组织/项目/设备)
  • 选择权限类型(查看/操作)

权限码列表

# 设备管理
device:view          # 查看设备
device:operate       # 操作设备
device:create        # 添加设备
device:delete        # 删除设备

# 充电控制
charge:start         # 开始充电
charge:stop          # 停止充电
charge:open_door     # 开门

# 充电记录
charge_record:view   # 查看充电记录
charge_record:export # 导出充电记录

# 设备日志
device_log:view      # 查看设备日志

# 能耗管理
energy:view          # 查看能耗
energy:export        # 导出能耗

# 系统设置
user:view            # 查看用户
user:create          # 创建用户
user:edit            # 编辑用户
user:delete          # 删除用户
role:view            # 查看角色
role:create          # 创建角色
role:edit            # 编辑角色
role:delete          # 删除角色
operation_log:view   # 查看操作日志

质量约束

  1. 完成代码后执行 cargo check + tsc --noEmit,零报错零警告
  2. 分层拆分单函数≤80行命名语义化完整注释
  3. 所有外部IO/网络请求异常捕获禁止裸panic
  4. 分支逻辑全覆盖,不遗漏兜底分支
  5. 常量抽离不使用废弃API
  6. Rust内存安全React函数组件+Hooks
  7. 权限校验必须覆盖所有API接口