From 48cadb9d8cf8700b8727a15f6a10b97dbbe9206e Mon Sep 17 00:00:00 2001 From: xuans Date: Sun, 27 Sep 2026 01:32:31 +0800 Subject: [PATCH] =?UTF-8?q?=E8=AE=B0=E5=BD=95=E7=94=A8=E6=88=B7=E5=88=86?= =?UTF-8?q?=E7=BB=84=E5=AE=9E=E6=9C=BA=E9=AA=8C=E6=94=B6=E5=B9=B6=E6=98=8E?= =?UTF-8?q?=E7=A1=AE=E5=8F=98=E6=9B=B4=E5=90=8E=E7=9A=84=E4=BC=9A=E8=AF=9D?= =?UTF-8?q?=E6=92=A4=E9=94=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- doc/user-groups.md | 37 +++++++++++++++++++++++++++++++++++-- 1 file changed, 35 insertions(+), 2 deletions(-) diff --git a/doc/user-groups.md b/doc/user-groups.md index ff6fc2c..8d5cf5b 100644 --- a/doc/user-groups.md +++ b/doc/user-groups.md @@ -1,6 +1,6 @@ # 用户分组接口与权限说明 -适用项目:Scert。更新日期:2026-09-25。 +适用项目:Scert。更新日期:2026-09-27。 ## 页面入口 @@ -39,6 +39,39 @@ ## 数据升级与验证边界 -迁移版本 8 为用户表增加可空的 `groups_json` 文本字段。旧记录的空值解释为默认分组,保留原账号、角色和密码摘要。每次读取用户列表时重新读取当前账号分组,调组不依赖重新登录。 +迁移版本 8 为用户表增加可空的 `groups_json` 文本字段。旧记录的空值解释为默认分组,保留原账号、角色和密码摘要。每次读取用户列表时重新读取当前账号分组,不依赖会话中缓存的分组。通过用户管理页面保存变更时,后端会撤销该用户的现有登录会话,包括仅调整分组的情况;该用户下一次请求会返回登录页面,重新登录后应用新的可见范围。不能将仓储层直接更新的单元测试解释为页面调组后无需重新登录。 SQLite 的旧版本升级与重复迁移由专项测试覆盖;MySQL 和 PostgreSQL 提供迁移文件,但本次专项测试不代表这两种数据库已完成真实环境升级验收。 + +## 2026年9月27日浏览器实机验收 + +运行版本为源码提交 `9ac222d6db61ce0daeecb846da42852778a1036c`。本轮延续已部署的 SQLite 现场,没有清库或重新初始化,也没有改变证书、DNS、部署服务器或代理配置。所有用户新增、编辑、登录、改密及删除操作均通过浏览器键鼠完成,没有直接调用实机业务接口或新增辅助测试脚本。 + +### 验收数据与结果 + +临时建立四个账号:管理员甲属于甲、乙两个组;普通成员属于甲组;管理员乙属于乙、丙两个组;另一普通成员不指定分组。所有测试账号保持用户指定的统一测试密码,文档不保存密码。 + +| 场景 | 本轮实机结果 | +|---|---| +| 超级管理员查看 | 默认分组置顶且展开,甲、乙、丙组默认折叠,能看到全部组及成员 | +| 管理员多组 | 管理员甲可同时加入甲、乙两组,展开后看到本人及双方共同组的成员 | +| 隐藏非共同组 | 管理员甲看不到管理员乙所属的丙组,也看不到默认组成员或主超级管理员 | +| 普通用户多组限制 | 添加第二组时明确提示先移除原分组,已有分组保持不变 | +| 多组管理员降级 | 选择普通用户后要求先移除多余分组,保存被拦截,未静默丢失原分组 | +| 回到默认分组 | 清除管理员甲的命名分组后,其旧会话失效;重新登录只看到本人及默认组普通成员,不显示其他命名组及主超级管理员 | +| 普通用户界面 | 只显示本人资料及修改密码,不显示分组、其他用户和管理员控制台 | +| 禁用账号 | 禁用管理员甲后,已有会话请求返回登录页;使用原正确密码重新登录也被拒绝 | +| 修改密码入口 | 普通用户可从用户管理打开改密弹窗;错误当前密码被拒绝,正确当前密码提交后撤销会话,重新登录成功 | +| 删除账号 | 删除已登录普通成员后,该会话下一次刷新返回登录页 | + +管理员页面没有用户新增、编辑、禁用或删除控件;直接伪造越权请求的拒绝行为由本地专项测试覆盖,本轮没有通过实机接口绕过键鼠限制。改密使用与当前相同的测试密码以遵循用户的统一密码要求,不据此宣称验证了不同新旧密码的轮换流程。 + +### 清理与回归 + +- [✓] 四个临时账号均经超级管理员页面删除,命名分组随最后成员删除而消失;页面仅保留原受保护主账号。 +- [✓] 通过 SQLite 只读统计补充核验:四个测试账号剩余零条、用户总数一条、命名分组关系零条;没有直接修改数据库。 +- [✓] 关闭临时角色验收标签页,保留原管理页面及原始测试资源。 +- [✓] Scert、Nginx 保持运行,Scert 主进程及重启计数未变,管理入口 HTTP 200、TLS 校验结果为零。 +- [✓] 本地重新执行用户分组、会话失效和仓储分组专项测试通过。 + +本节只证明上述 SQLite 版本的用户界面与对应会话行为,不替代全新生产初始化、正式管理证书签发、邮件找回密码、其他数据库迁移或完整生产部署验收。