基础平台数据与状态模型¶
状态:已批准设计,与 Plan 0.1.0 配套。本文只定义实体语义、关系、不变量与状态转移;具体存储结构由迁移任务承接。
实体与关系¶
| 实体 | 业务含义与必要属性 | 关系 |
|---|---|---|
| Account | 唯一且不可改的登录名、显示名、凭证散列、启用状态、是否必须改密、认证版本、编辑版本 | 恰好一个有效 Role;可有多个 Session |
| Role | 名称、是否内置、操作许可集合、授权版本、编辑版本 | 可关联零个或多个账户;空集合自定义角色可存在但不能进入管理区 |
| Permission | 已交付资源与操作的命名许可 | 仅 core 已批准目录可定义;角色可引用已有项,无自由新增 |
| Menu | 既有页面键、显示名称、同级顺序、显示开关与固定所需许可 | 不能改变页面或权限映射;服务端计算当前用户可见项 |
| Session | 认证主体快照、认证时刻、最后有效业务活动、账户与角色版本快照 | 框架持久化;会话是临时访问上下文,不是另一套账户 |
| LoginAttempt | 已验证格式的登录名对应失败次数和暂停截至时刻;未知账户同样处理 | 与账户存在与否无必然关系,不能只在 Account 上计数 |
| GovernanceGuard | 用于序列化跨账户和角色的管理变更 | 单个预置治理对象;不是业务审计记录 |
验证规则¶
- Account:登录名为 3—64 个小写字母、数字、点、下划线、短横线;按原样匹配。显示名非空且不超过 64 个字符;所有注册信息拒绝额外角色、权限、状态输入。注册原子绑定受保护 student,成功不自动登录。对应 auth FR-010、014—015。
- 密码:12—64 个 Unicode 码点,不裁剪原值,不静默截断;改密不等于原密码,必须核实旧密码。管理员无法查询明文或散列,临时明文只在重置成功结果出现一次。对应 auth FR-009—010、admin FR-006。
- Role:名称去除首尾空格后非空、最多 64 个字符、不可重复;内置角色不可重命名或删除;student/teacher 本期不附加管理许可。对应 admin FR-007、011。
- 权限集合:只能完整替换为已有许可集合;不支持通配、个人例外或数据范围表达式;配置者的可授予集合等于当前拥有的管理许可。不得编辑更高权限角色以间接影响其成员。对应 admin FR-008、013。
- 引用完整性:正在使用的角色不能删除,包含被禁用账户;分配与删除并发也须保持账户恰好一个角色。对应 admin FR-005、010。
- 恢复不变量:至少一个启用的内置 admin;其恢复许可不可移除。并发禁用、降级及自身修改都必须核实该条件。对应 auth FR-013、017 和 admin FR-012。
- 编辑版本:拒绝过期版本,单次操作要么全部完成、要么不修改;预览数量只供展示,提交时重新计算。对应 admin FR-009、016。
- 菜单:名称 1—32 个非空字符,同级顺序可调整;已有固定页面与权限映射不可编辑;至少保留管理恢复导航,本人身份和退出入口不可隐藏。对应 admin FR-014—015。
状态机¶
账户与密码¶
- 未注册 → 自助注册成功:启用、student、本人密码、无需首次改密。
- 启用 → 禁用:独立禁用许可,账户认证版本递增;全部旧会话失效。
- 禁用 → 启用:独立启用许可;不恢复禁用前会话。
- 任意现有角色 → 另一有效角色:核实赋权范围与恢复约束,递增账户认证版本。
- 正常密码 → 管理员重置:必须改密、认证版本递增;原密码与旧会话失效。
- 必须改密 → 成功改密:恢复普通登录资格,认证版本递增,必须重新登录;错误原密码不改变状态。
会话¶
- 匿名 → 凭证核实成功:框架轮换会话标识;建立普通或待改密受限上下文。
- 有效 → 过期:满 30 分钟业务空闲或满 8 小时绝对期限;等于期限也拒绝。
- 有效 → 撤销:账户禁用、认证版本或角色授权版本失配;下一次受保护操作拒绝。
- 有效 → 当前退出:仅当前会话撤销,其他独立会话不受影响。
- 已失效 → 有效:禁止;必须重新核实凭证创建新上下文,不能因账户重新启用复活。
登录失败¶
- 对格式合法的已知/未知登录名采用相同计数规则;格式非法输入直接拒绝,不产生可登录身份。
- 连续失败 1—4 次记录次数;第 5 次失败触发 15 分钟暂停,后续尝试返回统一稍后重试。
- 暂停期间正确密码也不能成功,不续暂停期限;到期允许重新尝试并从新的失败序列计数。
- 成功登录清零该登录名的连续失败状态;注册一个此前未知但被暂停的登录名不能清除暂停状态。
- 未达到阈值的连续失败不因普通请求或服务重启被清零;到期的暂停状态可回收。并发失败与成功结果须串行核实计数,不能丢增量或绕过已生效暂停。
角色与导航¶
- 角色新增时无隐含许可;绑定新集合后递增授权版本,所有关联账户旧会话拒绝。
- 角色改名只改变编辑版本和名称,不隐含增加许可或要求额外撤权。
- 菜单显示开关只改变导航,不授予或撤销操作许可;隐藏入口不能替代授权变更。
事务与时序约束¶
- 跨角色/账户管理变更、恢复约束检查、版本更新使用同一事务与治理锁;账户自助注册也须与角色删除/保护检查协调。
- 密码核实耗时不能令旧密码在并发重置后被用于新登录:成功前重新核实账户认证版本及凭证状态仍与本次核实对应;发生变化则拒绝或重新完整认证,不混用新版本与旧许可。
- 读取当前授权版本不使用可能过期的应用缓存;会话物理行删除/回收不是撤权的唯一证据。
- 已经入场并按当时许可执行的操作允许完成;变更成功后新入场操作必须按新状态核实。失败或无权操作不更新业务空闲时刻。