lab-edu 鉴权与三角色账户需求¶
本文已于 2026-10-29 经用户整稿评审确认生效;批准范围和依据见评审记录(本地资料,未发布)。 上位依据:项目宪法 §2、§5、§8;当前路线图。
1. 概述¶
背景与目标¶
为基础平台提供可验收的身份与访问边界:用户能够登录、识别自己的身份、退出;无权访问的人不能读取或修改受保护信息。管理员能够进入基础平台管理区,教师与学生进入各自的身份首页。
范围¶
- 用户自助注册、用户名与密码登录、退出、当前身份查看、会话失效。
- admin(管理员)、teacher(教师)、student(学生)三种角色的基础访问边界。
- 首次管理员初始化、自助注册的权限边界,以及账户被禁用、角色或权限变更、密码变更后的访问结果。
- 登录后主动更改自己的密码;忘记密码时管理员重置所产生的临时密码必须更改。
- 细粒度权限按“资源 × 操作”定义并按角色分配;本期不加入个人授权例外、通用数据行或字段级授权。
范围外¶
- 不做实验任务、报告提交、评分,也不为它们预设权限或数据结构。
- 不做手机或邮箱登录、短信或邮件找回密码、第三方登录、统一身份接入、多因素认证、长期免登录。
- 用户管理、角色配置、权限与菜单管理的完整页面由正式后台规格定义;本文只定义其访问边界和变更对登录状态的影响。
- 不引入消息通知、报表、导入导出、审计日志增强或多端支持;浏览器多标签页失效校验属于会话正确性,不新增客户端产品。
2. 已批准的业务决策¶
| 决策 | 正式规则 |
|---|---|
| 权限 | 按角色分配资源 × 操作许可,不加入个人例外、通用数据行或字段级授权 |
| 角色 | 三个内置角色加自定义角色,每账户恰好一个角色;具体目录、赋权范围和保护规则统一引用后台需求 |
| 注册 | 用户自助注册成功即启用并分配 student,返回登录入口;不自动登录,不验证真实学籍;注册者不能指定角色、权限或账户状态 |
| 管理身份 | teacher、admin 或自定义管理角色由有权管理员分配;内置 student/teacher 本期保持普通权限,自定义角色承接细分管理职责 |
| 会话 | 可有多个会话;空闲满 30 分钟或登录满 8 小时失效;退出只撤销当前会话 |
| 全部会话撤销 | 禁用、角色变更、改密、密码重置及角色权限集合变更后撤销受影响账户全部旧会话 |
| 登录失败 | 连续 5 次失败暂停该登录名尝试 15 分钟;暂停期间即使凭证正确也拒绝 |
权限目录由已批准功能定义。进入管理区不包含其下所有操作,允许查看不包含修改。菜单和按钮只反映许可,服务端对每次操作作最终判断;本人资源归属校验仍必须执行。
3. 需求¶
3.1 用户故事¶
US1:安全进入与离开系统(P1)¶
作为用户,我能自助创建普通账户,随后登录、看到自己的身份并退出,其他人不能复用已退出的登录状态。
- Why this priority:这是第一个能运行并展示价值的闭环,包含身份识别与权限拒绝,无需先完成账户管理页面。
- Independent Test:自助注册 1 个普通账户并完成登录、刷新、退出;另由受控初始化准备三角色账户和一个禁用账户,逐一验证身份首页与无权管理操作。
- 验收场景:
- Given 一个启用且无需改密的账户,When 输入正确凭证登录,Then 显示该账户名称与角色首页。
- Given 一个不存在的用户名,When 尝试登录,Then 显示“用户名或密码错误”,不能进入系统。
- Given 一个启用账户,When 输入错误密码,Then 与不存在用户显示相同文案。
- Given 一个禁用账户,When 输入正确凭证,Then 登录失败且不暴露账户状态。
- Given 一个已登录账户,When 退出成功,Then 继续使用原会话访问受保护信息被拒绝。
- Given 初始权限的 teacher 或 student 已登录,When 直接访问管理区或尝试管理操作,Then 因缺少操作许可而拒绝且目标数据不变。
- Given 一个尚未使用的合法登录名,When 用户自助提交注册信息,Then 创建 1 个普通账户并返回登录入口,使用本人设置的密码可以登录。
- Given 一个已被使用的登录名,When 再次注册,Then 提示登录名不可用,原账户及其密码保持不变。
- Given 一个未登录注册者,When 在注册信息中夹带角色、权限或启用状态的修改,Then 注册被拒绝且不产生高权限账户。
US2:账户变更及时影响访问(P2)¶
作为管理员,我希望禁用账户或改变角色后,旧的登录状态不能继续使用原有权限;细粒度授权变更也应撤销受影响账户旧会话。
- Why this priority:补齐账户生命周期;US1 可用初始化账户独立演示,US2 在其后扩展管理操作的影响。
- Independent Test:在两个浏览器会话中登录同一账户,由受控管理操作分别禁用、改角色、重置密码,再让两个会话各发起一次访问;管理页面不是本故事验收前提。
- 验收场景:
- Given 某账户已有两个有效会话,When 管理员禁用该账户,Then 变更成功后两个会话的下一次受保护访问均被拒绝。
- Given 某账户已登录,When 管理员更改其角色,Then 旧会话失效;重新登录后只拥有新角色允许的访问能力。
- Given 一个被禁用后重新启用的账户,When 复用禁用前的会话,Then 仍被拒绝,必须重新登录。
- Given 某角色拥有查看与禁用用户的许可,When 管理员撤销其禁用许可,Then 受影响账户全部旧会话失效,重新登录仍能查看但不能禁用;其他角色的权限不改变。
US3:本人改密与密码重置后恢复(P2)¶
作为用户,我在注册时自行设置密码,登录后能主动改密;忘记密码由管理员重置后,我必须更换临时密码。
- Why this priority:普通注册不依赖密码交接;遗忘密码仍有恢复路径,不依赖范围外的消息发送能力。
- Independent Test:使用预置临时密码账户验证受限登录、改密、旧密码拒绝和新密码成功;无需依赖账户创建页面。
- 验收场景:
- Given 一个待改密账户,When 使用正确临时密码登录,Then 只允许改密和退出,不进入普通首页或管理区。
- Given 一个待改密账户,When 成功设置符合规则的新密码,Then 全部旧会话失效,使用新密码重新登录后进入身份首页。
- Given 已登录账户,When 提交错误旧密码尝试主动改密,Then 改密失败,原密码与原会话保持有效。
3.2 基础权限矩阵¶
本表定义内置角色的初始分配;“允许”仍受账户启用、会话有效和已完成改密约束。实际判定依据操作许可,角色名本身不授予隐含的全部管理能力。
| 能力 | 未登录 | admin | teacher | student |
|---|---|---|---|---|
| 查看登录入口、尝试登录 | 允许 | 允许 | 允许 | 允许 |
| 自助注册普通账户 | 允许 | 退出后可使用 | 退出后可使用 | 退出后可使用 |
| 查看本人的名称、角色和首页 | 拒绝 | 允许 | 允许 | 允许 |
| 退出本人当前会话、修改本人密码 | 拒绝 | 允许 | 允许 | 允许 |
| 进入基础平台管理区 | 拒绝 | 允许 | 拒绝 | 拒绝 |
| 禁用/启用账户、重置密码、分配角色 | 拒绝 | 初始允许,按各项许可分别核实 | 初始拒绝 | 初始拒绝 |
| 查看角色、权限与菜单目录 | 拒绝 | 允许 | 拒绝 | 拒绝 |
| 配置角色与已有操作权限的绑定 | 拒绝 | 允许,赋权边界见后台需求 | 默认拒绝 | 默认拒绝 |
| 创建自定义角色、编辑已有菜单展示 | 拒绝 | 按对应许可开放,具体规则见后台需求 | 初始拒绝 | 初始拒绝 |
| 自由新增权限或任意菜单地址 | 拒绝 | 不开放 | 不开放 | 不开放 |
| 访问其他账户的个人信息 | 拒绝 | 仅限已批准的管理操作 | 拒绝 | 拒绝 |
teacher、student 本期首页只展示本人身份和退出入口,不加入后续业务模块入口。没有明确允许的访问一律拒绝。
自定义角色不在上述初始矩阵中逐项列举:依据已分配的操作许可展示入口与执行操作;没有管理区进入许可时显示普通身份首页。不得将角色名称是否等于 admin 写成所有管理操作的统一放行条件。自助注册不承担管理员代开户流程,管理员重置密码仍保留。
3.3 功能需求与验证映射¶
| 编号 | 必须满足的行为 | 验证依据 |
|---|---|---|
| FR-001 | 支持用户自助注册及用户名与密码登录;不支持其他登录方式 | US1;SC-011 |
| FR-002 | 启用、凭证正确且无需改密的账户登录成功;不存在、密码错误、禁用三种情况均显示“用户名或密码错误”且不建立有效会话 | US1 场景 1—4 |
| FR-003 | 登录后只显示本人必要身份信息;刷新页面后保留有效登录状态,不显示密码或可复用登录凭证 | US1;刷新并检查本人身份展示 |
| FR-004 | 以明确的资源操作许可执行访问判定,上表仅定义初始分配;伪造身份、角色或绕过页面直接发起操作均不能扩大权限;自定义角色同样按许可判定 | US1 场景 6;SC-002、013 |
| FR-005 | 退出成功必须撤销当前会话;重复退出返回已退出状态;其他会话按 Q3 保持有效 | US1 场景 5;SC-003 |
| FR-006 | 满足 Q3 的空闲或绝对时限即失效;后台自动刷新和无权请求不延长空闲时间;本期不提供长期免登录 | SC-004 |
| FR-007 | 禁用、角色变更、改密或重置密码成功后,全部旧会话的下一次受保护访问被拒绝;已失效会话不能因重新启用账户而恢复。角色权限集合变更也撤销所有受影响账户旧会话 | US2;SC-005、SC-013 |
| FR-008 | 会话失效后提示重新登录;无权访问显示拒绝说明,不向用户显示目标数据;身份核实失败时不得展示受保护内容 | SC-002、SC-007 |
| FR-009 | 临时密码登录只授予改密和退出能力;改密成功后必须重新登录;管理员不能查看用户现有密码 | US3;SC-006 |
| FR-010 | 主动改密必须验证原密码;新密码为 12—64 个字符、不得与原密码相同,允许粘贴且不静默截断;用户名为 3—64 个小写字母、数字、点、下划线或短横线,按原样精确匹配,不自动转换 | US3;长度边界、重复密码、错误原密码与非法用户名用例 |
| FR-011 | 按 Q3 的失败阈值暂停该登录名的登录尝试;暂停期间显示统一稍后重试提示;到期可重新尝试,成功登录清零连续失败次数;未知登录名同样适用 | SC-008;验证暂停期内即使凭证正确也拒绝 |
| FR-012 | 登录凭证不得出现在地址栏或普通业务日志;界面不回显密码;受保护信息在退出、切换账户后不得由前一账户的页面缓存重新展示 | 检查日志与地址栏;SC-003、SC-007 |
| FR-013 | 首位管理员必须经受控初始化产生且没有公开默认密码;重复初始化不得覆盖既有账户;管理操作不得禁用、降级最后一个启用的管理员 | 初始化重复执行;仅余一个管理员时尝试禁用或降级 |
| FR-014 | 注册须提供合法登录名、非空且不超过 64 字符的显示名称及符合 FR-010 的密码;重复登录名不创建账户、不覆盖原账户;并发注册同一登录名最多创建 1 个账户 | US1 场景 7—8;SC-011 |
| FR-015 | 自助注册账户直接启用、初始角色为 student,无管理许可;注册不得接收角色、权限或账户状态的自定义覆盖;注册完成返回登录入口,不自动登录,也不要求更改本人刚设置的密码 | US1 场景 7、9;SC-011—012 |
| FR-016 | 以资源 × 操作分别授权,按角色绑定已有权限;缺少明确许可即拒绝;查看不包含修改、禁用、重置密码或授权能力;菜单与按钮只能反映许可,不能产生许可;本期不加入个人例外、通用数据行或字段级授权 | US2 场景 4;SC-013 |
| FR-017 | 禁止未经授权的授权操作及超出操作者可授予范围的赋权;不得通过修改角色权限集合使最后一个启用管理员失去账户恢复与权限配置能力;保护范围在后台需求中列为不可移除的恢复权限集合 | SC-014;后台需求承接 |
本规格与后台规格共同构成批准需求;FR-010、FR-013、FR-016—017 的管理页面与赋权保护规则由后台规格承接,不重复定义。
4. 验收标准¶
验收准备:1 个普通状态的三角色账户各一份、1 个禁用账户、1 个临时密码账户;另准备第二个启用管理员用于管理变更。测试数据不含真实个人信息。时限场景可使用受控时间推进,不能以修改正式运行阈值替代。
| 编号 | 用户可观察的通过标准 | 对应需求 |
|---|---|---|
| SC-001 | 3 种角色各完成 1 次登录、刷新和身份确认,全部显示正确账户及角色;错误密码、不存在用户、禁用账户共 3 类登录全部失败且文案相同 | FR-001—003 |
| SC-002 | 对初始权限的 teacher、student 各验证管理入口、直接访问管理页面、绕过界面发起管理操作共 6 项;越权成功数为 0,目标账户数据变更数为 0;拒绝原因是缺少许可 | FR-004、008 |
| SC-003 | 在同一会话的两个标签页中登录并退出;退出成功后重新访问、返回历史页面、刷新共 3 种路径均不能再次展示受保护信息;另一个独立会话仍可访问 | FR-005、012 |
| SC-004 | 分别推进到 30 分钟空闲边界和 8 小时登录边界,2 类会话均要求重新登录;到期前的有效操作只续空闲期限,不续 8 小时总期限 | FR-006 |
| SC-005 | 禁用、角色变更、重置密码各使用 2 个旧会话验证,共 6 次变更后访问全部拒绝;重新启用后旧会话恢复数为 0;角色变更后重新登录只显示新角色 | FR-007 |
| SC-006 | 临时密码登录时访问首页与管理区共 2 次均被限制;成功改密后原密码登录成功数为 0,新密码登录成功 1 次;主动改密后 2 个旧会话全部失效 | FR-007、009—010 |
| SC-007 | 模拟登录时断网、查询身份时超时、退出时断网共 3 类故障,每类均显示可理解的失败与重试提示;没有明确退出成功时不得声称已退出;切换账户后前一账户信息展示数为 0 | FR-008、012 |
| SC-008 | 对已知与未知登录名各连续失败 5 次,第 6 次尝试均提示稍后重试;15 分钟到期后已知账户用正确密码可登录;其他账户不因该登录名被暂停而无法登录 | FR-011 |
| SC-009 | 对密码长度 11、12、64、65 各测 1 次,仅 12 与 64 长度且符合其他规则的新密码可提交;同密码与错误原密码各拒绝 1 次;非法用户名样例至少 3 个全部拒绝 | FR-010 |
| SC-010 | 初始化连续执行 2 次不覆盖原管理员;仅余 1 个启用管理员时,禁用、降级共 2 类操作均失败且管理员保留原状态 | FR-013 |
| SC-011 | 用 1 个未使用登录名自助注册成功且能登录;重复与两次并发注册同一登录名均最多保留 1 个账户,原账户密码不被覆盖;本人设置的密码首次登录无需改密 | FR-001、014—015 |
| SC-012 | 用注册信息夹带管理员角色、额外权限、账户状态各测试 1 次,共 3 次全部拒绝且高权限账户新增数为 0;正常注册得到 student,管理操作成功数为 0 | FR-015 |
| SC-013 | 同一角色拥有查看但没有禁用许可时,查看成功 1 次、禁用失败 1 次;撤销已有禁用许可后,该角色的 2 个账户各 2 个旧会话全部失效,重新登录仍能查看但不能禁用;无关角色访问不受影响 | FR-007、016 |
| SC-014 | 无授权许可的账户尝试赋权、越出可授予范围赋权、移除最后管理员的恢复权限共 3 类操作均失败;目标权限集合保持原状 | FR-017 |
Edge Cases(边界条件)¶
- 空值、超长输入、包含非法字符的用户名:拒绝且不给出内部错误;密码中的空格不得被擅自删除。
- 第 5 次失败触发暂停;暂停期间不接受正确密码。短期暂停不等于管理员禁用账户,两种状态分别处理。
- 空闲时限以最后一次成功的受保护用户操作计时;自动轮询、失败请求不刷新计时。
- 禁用与正在处理的请求并发:以变更成功后新进入的受保护操作为撤销边界;不得声称能撤回已经完成的操作。
- 多标签页:退出成功后清理本人信息并同步当前浏览器标签页;仍保留的页面在再次激活或访问时不得展示旧受保护信息。
- 网络故障:失败的登录不显示成功;结果未知的退出清理当前页面敏感内容并提示重试,不能假定远端撤销已完成。
- 返回历史页面或切换账户:不恢复前一账户的列表、表单或身份信息。
- 重复退出无需报内部错误;登录后的返回地址只允许本系统内已授权位置。
- 并发注册相同登录名:最多一个成功,其余提示不可用,不泄漏或覆盖既有账户信息。
- 注册响应丢失:再次提交同一登录名不能覆盖首个请求创建的账户,提示登录名不可用并提供登录入口。
- 注册只核实输入合法性,不验证真实学籍或教师身份;注册者不得自选 teacher/admin。若实际部署要求核验,需先修订此默认流程。
- 授权变更按受影响角色关联账户撤销会话;不能只修改菜单可见性或等到自然超时。
5. 假设¶
- 当前用户通过桌面浏览器使用基础平台,界面为中文。
- 登录名唯一且创建后本期不可更改;显示名称不是登录凭证。
- 注册成功即启用并以 student 为初始角色,无需管理员审核;teacher/admin 由获授权管理员分配。这些规则已随整稿确认。
- 普通注册由用户自行设置密码;忘记密码时管理员线下交付重置临时密码,本期不开发发送渠道,不在文档、测试样例中放真实密码。
- 自助注册不是账户身份的实名或学籍证明,也不隐含授予教师权限。
- 本节默认行为已于 2026-10-29 随整稿批准;需求变更按项目宪法执行。
6. 关键实体¶
- 账户:持有唯一登录名与显示名称,具有启用或禁用状态,可处于待改密状态;恰好一个角色。
- 角色:代表当前基础平台的一组操作许可;教师和学生的初始权限只包含本人身份与改密能力。保留三个内置角色并允许自定义角色,不加入多角色合并;具体规则引用后台需求。
- 权限:对某一资源执行某项操作的许可,由服务端给出最终判断;菜单可见不能代替操作权限。
- 菜单:已获准页面的导航展示,不是额外授权来源。
- 会话:一次成功身份核实后的访问上下文,可独立退出,并受期限、账户状态和凭证变更约束。
7. 设计:用户流程¶
- 打开受保护页面 → 核实身份 → 未登录则进入登录入口,已登录则继续检查账户状态与权限。
- 凭证正确 → 待改密则进入受限改密页;否则进入对应角色首页。
- 访问管理能力 → 再核实操作权限 → 允许则执行,否则拒绝且不改变数据。
- 退出或会话失效 → 清理身份与受保护内容 → 提示重新登录。
- 自助注册 → 校验输入与登录名唯一性 → 按默认规则创建普通账户 → 返回登录入口;不由注册者决定角色与权限。
8. API 与数据:需求边界¶
本节仅列需要的交互及最小信息,不定义接口路径、传输方式或字段类型;具体契约属于后续技术设计。
| 交互 | 输入语义 | 输出语义 |
|---|---|---|
| 自助注册 | 登录名、显示名称、本人设置的密码 | 注册成功并返回登录入口,或输入/登录名不可用提示 |
| 登录 | 登录名、密码 | 成功、需改密、统一失败或暂停提示 |
| 查询当前身份 | 当前访问上下文 | 本人名称、角色、允许展示的入口,或重新登录提示 |
| 退出 | 当前访问上下文 | 已退出,或结果未知并提示重试 |
| 本人改密 | 当前访问上下文、原密码、新密码 | 成功并要求重新登录,或明确失败 |
| 账户管理变更 | 来自获授权管理员的操作 | 管理结果;与本文约定一致的旧会话撤销效果 |
本节按正式 CONTRIBUTING 的职责分工只描述交互语义,具体契约由技术规划承接。
9. 评审与验证状态¶
2026-10-29 用户在整稿评审包之后回复“好的,我已经确定,请你继续。”,确认本规格及其配套规则。正式化来自该确认,不追溯为早期 Q1—Q3 回复的扩大授权。
- 17 条功能需求、14 条验收标准及本地引用已做文档检查。
- 技术自查结论经用户整稿确认;未虚构另有独立评审人或独立评审过程。
- 产品实现及本规格验收尚未执行。认证、授权、会话单元测试要求来自项目宪法 §5。
- 批准前草稿快照见
docs/references/archived/ratification-20261029/,评审依据见批准记录(本地资料,未发布)。