Scert/doc/user-groups.md

45 lines
2.8 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.

# 用户分组接口与权限说明
适用项目:Scert。更新日期:2026-09-25。
## 页面入口
- 系统设置位于侧栏的系统管理区域,打开已有设置面板。
- 修改密码位于用户管理页面,修改当前登录账号的密码。
- 默认分组置顶并始终展开;命名分组初始折叠。
- 普通用户进入用户中心,只显示本人资料及修改密码,不显示分组。
## 可见范围
| 角色 | 用户读取范围 | 分组关系 | 用户新增、编辑、删除 |
|---|---|---|---|
| 超级管理员 | 全部用户和分组 | 主账号保持受保护 | 允许,主账号保护规则不变 |
| 管理员 | 自己及所属组成员的并集 | 可加入多个命名分组 | 不允许 |
| 普通用户 | 仅自己 | 最多一个命名分组 | 不允许 |
没有命名分组的账号属于默认分组。未分组管理员可见默认组成员,但不可见其他超级管理员。管理员读取多组成员时,只返回双方共同的分组,不泄露对方的其他组名。这里限定的是用户列表可见范围,不代表域名、证书、服务器资源已经实现分组隔离。
## 接口
沿用现有会话认证与同源校验。
| 方法 | 路径 | 说明 |
|---|---|---|
| GET | `/api/v1/users` | 按角色过滤的用户列表 |
| GET | `/api/v1/users/:id` | 查询可见用户;越权与不存在均返回 404 |
| POST | `/api/v1/users` | 超级管理员创建用户 |
| PUT | `/api/v1/users/:id` | 超级管理员更新用户 |
| DELETE | `/api/v1/users/:id` | 超级管理员删除用户 |
列表响应增加 `current_role`、`current_user_id`。用户对象的 `groups` 为字符串数组;默认组和普通用户读取时省略该字段。密码摘要不返回。
新增和更新请求支持 `groups`:省略或传 `null` 时,新增使用默认组,更新保留原关系;传 `[]` 清空命名分组、回到默认组。组名去首尾空白、去重并排序,区分大小写,长度为 1 到 32 个字符,不允许控制字符或保留名称“默认分组”。最多 32 个组,普通用户最多 1 个组。多组管理员降级为普通用户时,必须明确保留不超过一个组,否则返回 400,不会静默丢失分组。
分组名称由保存用户时创建;没有独立空组、组重命名或组删除接口。删除最后一个组内成员后,该组不再显示。
## 数据升级与验证边界
迁移版本 8 为用户表增加可空的 `groups_json` 文本字段。旧记录的空值解释为默认分组,保留原账号、角色和密码摘要。每次读取用户列表时重新读取当前账号分组,调组不依赖重新登录。
SQLite 的旧版本升级与重复迁移由专项测试覆盖;MySQL 和 PostgreSQL 提供迁移文件,但本次专项测试不代表这两种数据库已完成真实环境升级验收。