172 lines
4.6 KiB
Markdown
172 lines
4.6 KiB
Markdown
# 任务005:权限系统
|
||
|
||
## 目标
|
||
|
||
实现RBAC权限控制,精确到按钮级别。
|
||
|
||
## 权限模型
|
||
|
||
### 角色
|
||
- **总管理员** — 全部权限,管理所有组织/项目/设备
|
||
- **企业管理员** — 只能管理自己组织下的项目/设备/人员
|
||
- **普通用户** — 根据配置查看/操作特定组织/项目/设备
|
||
|
||
### 权限粒度
|
||
- **组织级** — 用户可看/操作整个组织下所有设备
|
||
- **项目级** — 用户只能看/操作某项目下的设备
|
||
- **设备级** — 用户只能看/操作某一台柜子
|
||
|
||
### 权限类型
|
||
- `view` — 查看
|
||
- `operate` — 操作(控制设备)
|
||
|
||
## 数据库表
|
||
|
||
```sql
|
||
-- 角色表
|
||
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 # 设置用户权限范围
|
||
```
|
||
|
||
### 权限校验中间件
|
||
```rust
|
||
// 路由级别权限校验
|
||
#[middleware]
|
||
fn require_permission(permission: &str) {
|
||
// 1. 从token获取用户ID
|
||
// 2. 查询用户角色和权限
|
||
// 3. 校验权限范围(组织/项目/设备)
|
||
// 4. 无权限返回403
|
||
}
|
||
```
|
||
|
||
## 前端组件
|
||
|
||
### 权限组件
|
||
```tsx
|
||
// 按钮级权限控制
|
||
<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接口
|