Files
junhong_cmp_fiber/openspec/specs/role-permission/spec.md
huang 1b9080e3ab 实现角色权限体系重构
本次提交完成了角色权限体系的重构,主要包括:

1. 数据库迁移
   - 添加 tb_permission.platform 字段(all/web/h5)
   - 更新 tb_role.role_type 注释(1=平台角色,2=客户角色)

2. GORM 模型更新
   - Permission 模型添加 Platform 字段
   - Role 模型更新 RoleType 注释

3. 常量定义
   - 新增角色类型常量(RoleTypePlatform, RoleTypeCustomer)
   - 新增权限端口常量(PlatformAll, PlatformWeb, PlatformH5)
   - 添加角色类型与用户类型匹配规则函数

4. Store 层实现
   - Permission Store 支持按 platform 过滤
   - Account Role Store 添加 CountByAccountID 方法

5. Service 层实现
   - 角色分配支持类型匹配校验
   - 角色分配支持数量限制(超级管理员0个,平台用户无限制,代理/企业1个)
   - Permission Service 支持 platform 过滤

6. 权限校验中间件
   - 实现 RequirePermission、RequireAnyPermission、RequireAllPermissions
   - 支持 platform 字段过滤
   - 支持跳过超级管理员检查

7. 测试用例
   - 角色类型匹配规则单元测试
   - 角色分配数量限制单元测试
   - 权限 platform 过滤单元测试
   - 权限校验中间件集成测试(占位)

8. 代码清理
   - 删除过时的 subordinate 测试文件
   - 移除 Account.ParentID 相关引用
   - 更新 DTO 验证规则

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-01-10 09:51:52 +08:00

146 lines
5.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# role-permission Specification
## Purpose
TBD - created by archiving change add-role-permission-system. Update Purpose after archive.
## Requirements
### Requirement: 角色类型定义
系统 SHALL 定义两种角色类型平台角色role_type=1用于平台用户的职责区分客户角色role_type=2用于代理和企业账号的能力边界控制。
#### Scenario: 创建平台角色
- **WHEN** 创建角色时指定 role_type = 1
- **THEN** 系统创建平台角色,该角色只能分配给平台用户
#### Scenario: 创建客户角色
- **WHEN** 创建角色时指定 role_type = 2
- **THEN** 系统创建客户角色,该角色可分配给代理账号或企业账号
#### Scenario: 角色类型常量使用
- **WHEN** 代码中需要判断角色类型
- **THEN** 必须使用 constants.RoleTypePlatform、constants.RoleTypeCustomer 常量
---
### Requirement: 权限端口属性
系统 SHALL 在权限表添加 platform 字段用于标识权限的适用端口all全部、web仅Web后台、h5仅H5端。默认值为 all。
#### Scenario: 创建通用权限
- **WHEN** 创建权限时 platform = 'all' 或未指定
- **THEN** 该权限在 Web 后台和 H5 端均可用
#### Scenario: 创建Web专用权限
- **WHEN** 创建权限时 platform = 'web'
- **THEN** 该权限仅在 Web 后台可用H5 端无法使用
#### Scenario: 创建H5专用权限
- **WHEN** 创建权限时 platform = 'h5'
- **THEN** 该权限仅在 H5 端可用Web 后台无法使用
#### Scenario: 按端口过滤权限列表
- **WHEN** 前端请求用户权限列表时指定 platform 参数
- **THEN** 系统返回 platform 为指定值或 'all' 的权限
---
### Requirement: 角色类型与用户类型匹配
系统 SHALL 在分配角色时校验角色类型与用户类型的匹配关系:平台用户只能分配平台角色,代理/企业账号只能分配客户角色,超级管理员和个人客户不分配角色。
#### Scenario: 平台用户分配平台角色
- **WHEN** 为平台用户user_type=2分配平台角色role_type=1
- **THEN** 系统允许分配
#### Scenario: 平台用户分配客户角色
- **WHEN** 为平台用户user_type=2分配客户角色role_type=2
- **THEN** 系统拒绝分配并返回错误"角色类型与账号类型不匹配"
#### Scenario: 代理账号分配客户角色
- **WHEN** 为代理账号user_type=3分配客户角色role_type=2
- **THEN** 系统允许分配
#### Scenario: 代理账号分配平台角色
- **WHEN** 为代理账号user_type=3分配平台角色role_type=1
- **THEN** 系统拒绝分配并返回错误"角色类型与账号类型不匹配"
#### Scenario: 企业账号分配客户角色
- **WHEN** 为企业账号user_type=4分配客户角色role_type=2
- **THEN** 系统允许分配
#### Scenario: 超级管理员分配角色
- **WHEN** 尝试为超级管理员user_type=1分配任何角色
- **THEN** 系统拒绝分配并返回错误"超级管理员不需要分配角色"
---
### Requirement: 账号角色数量限制
系统 SHALL 对不同用户类型实施角色数量限制:平台用户可分配多个角色,代理账号和企业账号只能分配一个角色。
#### Scenario: 平台用户分配多个角色
- **WHEN** 平台用户已有 N 个角色,再分配第 N+1 个角色
- **THEN** 系统允许分配,该用户拥有 N+1 个角色
#### Scenario: 代理账号分配第一个角色
- **WHEN** 代理账号没有角色,分配第一个角色
- **THEN** 系统允许分配
#### Scenario: 代理账号分配第二个角色
- **WHEN** 代理账号已有一个角色,尝试分配第二个角色
- **THEN** 系统拒绝分配并返回错误"该账号类型只能分配一个角色"
#### Scenario: 企业账号角色数量限制
- **WHEN** 企业账号已有一个角色,尝试分配第二个角色
- **THEN** 系统拒绝分配并返回错误"该账号类型只能分配一个角色"
#### Scenario: 替换代理账号的角色
- **WHEN** 代理账号已有一个角色,需要更换为另一个角色
- **THEN** 系统需要先取消当前角色,再分配新角色
---
### Requirement: 权限端口校验
系统 SHALL 在权限校验时考虑请求来源Web/H5和权限的 platform 属性,只有当权限的 platform 为 'all' 或与请求来源匹配时才允许访问。
#### Scenario: Web请求访问通用权限
- **WHEN** 来自 Web 后台的请求访问 platform='all' 的权限保护接口
- **THEN** 权限校验通过(前提是用户拥有该权限)
#### Scenario: Web请求访问Web权限
- **WHEN** 来自 Web 后台的请求访问 platform='web' 的权限保护接口
- **THEN** 权限校验通过(前提是用户拥有该权限)
#### Scenario: Web请求访问H5权限
- **WHEN** 来自 Web 后台的请求访问 platform='h5' 的权限保护接口
- **THEN** 权限校验失败,返回错误"该权限不适用于当前端口"
#### Scenario: H5请求访问Web权限
- **WHEN** 来自 H5 端的请求访问 platform='web' 的权限保护接口
- **THEN** 权限校验失败,返回错误"该权限不适用于当前端口"
---
### Requirement: 用户权限列表查询
系统 SHALL 提供 API 供前端查询当前登录用户的权限列表,支持按端口过滤,并返回权限编码列表和菜单树结构。
#### Scenario: 查询全部权限
- **WHEN** 用户调用 GET /api/v1/account/permissions
- **THEN** 系统返回用户拥有的所有权限(权限编码列表 + 菜单树)
#### Scenario: 查询Web端权限
- **WHEN** 用户调用 GET /api/v1/account/permissions?platform=web
- **THEN** 系统返回 platform 为 'all' 或 'web' 的权限
#### Scenario: 查询H5端权限
- **WHEN** 用户调用 GET /api/v1/account/permissions?platform=h5
- **THEN** 系统返回 platform 为 'all' 或 'h5' 的权限
#### Scenario: 构建菜单树
- **WHEN** 返回权限列表时
- **THEN** 系统根据权限的 parent_id 关系构建层级菜单树结构
---