edit | blame | history | raw

计划改动清单

  • 对应需求版本:v0.3-MVP(Owner冻结)
  • 当前阶段:前后端实现/开发自测、一次独立Gate C、本机部署、前后端Gate D、隔离与真实浏览器Gate A和本地范围Gate P均PASS;本地实例保持运行,正式线上仍禁止
  • 原则:先落地基本功能、再分段迭代;只做员工本人修改密码闭环,不在首版重构整套认证体系,不重复评审已经冻结的方案

第一阶段候选改动

改动面 最小改动 主责 验证
前端账号入口 在当前账号信息附近增加“修改密码” UI/前端 所有启用角色可见,不影响现有导航
修改密码表单 当前密码、新密码、确认密码和基本提示 UI/前端 错误、提交中、成功和后端离线状态
后端本人改密接口 依据登录身份修改本人密码 后端 当前密码校验、越权、边界和异常
登录状态 修改成功后清除当前登录并返回登录页 前端/后端 旧密码失败、新密码成功
主管账号管理 保持现有新建账号和重置密码流程 前端/后端 原功能回归不受影响
最小测试 覆盖MVP十项验收标准 开发/测试 自动化或可复验的最小测试记录

本机部署与浏览器验收路线

  1. 运维在127.0.0.1以生成数据启动单进程、单写实例,确认不读取data/并提供停止入口。
  2. 后端与前端分别对同一运行实例执行Gate D,只确认已审核源码、页面资源和API关键链路,不修改代码。
  3. 测试与质量使用真实浏览器执行最小Gate A,覆盖登录、改密、退出、新旧密码重登、错误关闭和360px布局。
  4. 产品只在前述结果均PASS后执行本地范围Gate P;任何步骤失败只返回对应责任角色,不扩大范围。

Gate R统一冻结清单

Gate R只冻结第一阶段最小实现材料,不把延期安全能力重新并入MVP。以下各项必须有明确结论、责任角色和可复核证据;任一适用项未PASS时不得进入业务实现。

编号 必须冻结的内容 主责角色 通过条件
R-01 本人改密专用接口契约 架构、后端、前端、安全 路径、方法、认证方式、请求字段、响应字段明确;不接受目标账号参数;当前密码和新密码只进入请求体
R-02 登录身份与账号状态 架构、后端、安全、测试 只使用后端已认证身份;未登录、停用账号和越权构造均被拒绝
R-03 密码与确认规则 后端、前端、测试 8至64字符的计数口径、两端空格不裁剪、新旧不同、确认密码归属及前后端一致性明确
R-04 原子更新、并发与失败语义 架构、后端、测试 校验和写入的顺序、并发冲突、失败不落盘、旧密码保留及错误返回明确
R-05 成功退出与重新认证 前端、后端、架构、测试 成功后清理当前登录并返回登录页;旧密码失败、新密码成功;完整多设备会话撤销继续延期
R-06 最小交互规格 UI、前端 顶部入口、三字段表单、提交/取消、移动端单列、焦点与关闭、防重、提示和无障碍规则明确
R-07 稳定错误码和页面映射 架构、后端、前端、UI、测试 未登录、停用、当前密码错误、规则错误、新旧相同、并发冲突和后端不可用均有稳定且不泄密的映射
R-08 敏感值与故障关闭 安全、前端、后端、运维 密码不进入URL、查询参数、响应、日志、文档或浏览器持久化;后端离线不回退;非本地隔离环境使用HTTPS
R-09 十项验收测试矩阵 测试、前端、后端、安全 隔离环境、虚构角色账号、正常/异常/越权/停用/离线/敏感值用例、自动化或可复验入口明确
R-10 测试数据复位与回滚 运维、架构、后端、测试 环境身份、备份点、虚构账号密码复位、失败回滚、验证与责任人明确;禁止接触生产账号数据
R-11 实现拆分与精确基线计划 前端、后端、架构、测试 前后端改动边界、自测项、精确diff/commit冻结方式及Gate C输入明确,不夹带模块化重构

Gate R角色输出

  • 架构与数据治理:统一接口、身份、原子性、并发、重新认证和回滚边界。
  • UI与交互设计:最小页面结构、状态、移动端和无障碍规格。
  • 前端开发:页面承载点、请求状态机、错误映射、登录清理和自测方案。
  • 后端开发:接口字段、认证身份、校验、持久化、并发和主管重置回归方案。
  • 代码审核与安全:威胁边界、敏感值规则、停止线及未来Gate C证据清单。
  • 测试与质量:十项验收矩阵、虚构样本、环境前置、自动化和脱敏证据。
  • 运维与发布:仅限隔离测试环境的部署、备份、复位和回滚方案;正式生产部署不在范围。

Gate R首轮结果与契约冲突

角色 首轮结论 事件 当前处理
架构与数据治理 PASS COLLAB-20260717-077 分项通过;负责收敛唯一接口契约
UI与交互设计 PASS COLLAB-20260717-078 交互规格已冻结
前端开发 CHANGES_REQUESTED COLLAB-20260717-079 QUEUE-024保持WAITING,等待唯一契约后复评
后端开发 PASS COLLAB-20260717-080 分项通过;须确认架构收敛契约可实施
代码审核与安全 PASS COLLAB-20260717-081 安全停止线与Gate C证据已冻结
测试与质量 CHANGES_REQUESTED COLLAB-20260717-082 QUEUE-027保持WAITING,等待唯一契约和可执行入口后复评
运维与发布 PASS COLLAB-20260717-083 隔离测试环境机械方案已冻结

当前必须收敛的技术差异:

  1. 接口路径:架构建议POST /api/v1/me/password/change,后端建议POST /api/account/change-password
  2. 请求字段:架构与UI建议确认密码只在前端校验、请求体仅含当前密码和新密码;后端建议三字段均提交并由后端最终校验。
  3. 成功响应:架构建议204 No Content,后端建议200和脱敏成功标识。
  4. 错误码命名:两份分项的HTTP语义基本一致,但机器码名称尚未统一。
  5. 字符计数:前端与后端建议Unicode码点计数,需由架构写入唯一契约。

共同事实保持不变:账号只来自后端认证上下文、不接受目标账号字段、停用账号拒绝、失败不落盘、同账号并发最多一次成功、后端离线失败关闭、成功后当前登录失效、密码不进入URL/响应/日志/文档/持久化。

协作事件标题已只读复核为76个且76个唯一,重复0;测试和安全在文件并发更新期间看到的重复快照不再作为持续阻塞。

Gate R v0.4唯一接口契约(当前事实源)

以下契约由架构与数据治理在COLLAB-20260717-087收敛为PASS,取代首轮架构和后端分项中的全部备选接口。产品需求版本仍为v0.3-MVP;v0.4仅是Gate R技术契约版本。

接口与请求

  • 方法和路径:POST /api/v1/me/password/change
  • Content-Typeapplication/json
  • 认证:只使用Authorization头建立的后端认证上下文;账号不得来自路径、查询参数或请求体。
  • 请求体严格且只能包含currentPassword: stringnewPassword: string
  • confirmPassword只属于前端防误输入校验,不发送后端;它和任何用户名、用户ID、角色、状态、Token或未知字段均按INVALID_REQUEST拒绝。
  • 接口不接受查询参数。

字符与校验

  • 新密码长度按Unicode码点计数,前后端等价于Array.from(value).length;8和64有效,7和65无效。
  • 当前密码和新密码均不裁剪、不折叠、不做Unicode规范化;空格计入码点数,新旧按原始字符串比较。
  • 后端顺序固定为:严格Schema → 认证 → 进入账号级临界区 → 重新读取账号与启用状态 → 验证当前密码 → 校验新密码长度 → 校验新旧不同 → CAS/原子持久化。

成功响应

  • 成功返回204 No Content,响应体必须为空。
  • 设置Cache-Control: no-store
  • 不返回账号对象、新Token或其他凭据。
  • 成功后当前认证失效;前端清除表单、认证和业务态并返回登录页。完整多设备会话撤销继续延期。

稳定错误码

错误结构固定为error.code、安全的error.messageerror.requestId,不得包含密码、账号明细、存储细节、堆栈或完整请求。

HTTP 稳定错误码 UI唯一语义
400 INVALID_REQUEST 固定“请求无效”,不得展示原始响应
401 AUTHENTICATION_REQUIRED 清空表单和认证,返回登录页
403 ACCOUNT_DISABLED 清空表单和认证,返回登录页并提示账号不可用
422 CURRENT_PASSWORD_INCORRECT 只清空并聚焦当前密码
422 PASSWORD_LENGTH_INVALID 聚焦新密码,提示8至64个Unicode码点
422 NEW_PASSWORD_SAME_AS_CURRENT 聚焦新密码,提示不能与当前密码相同
409 PASSWORD_UPDATE_CONFLICT 清空表单和认证,返回登录页并重新认证
503 PASSWORD_CHANGE_UNAVAILABLE 保持失败状态、解除忙碌,禁止本地回退和自动重试
500 INTERNAL_ERROR 固定通用错误,禁止展示原始响应或堆栈

确认密码不一致是前端字段错误,不存在服务端确认密码错误码。网络断开和格式未知响应分别作为前端本地状态处理,均不得显示成功。

原子、并发与兼容

  • 本人改密、主管重置和账号停用共享账号级写入原语与修订号/CAS;重叠写入最多一个成功。
  • 持久化失败不得发布内存新状态,原密码和原数据保持不变。
  • 主管原重置业务和授权保持不变,但不得新增第二套直接密码写入路径。
  • 当前隔离测试阶段限定单后端进程/单写入实例;多进程或多实例必须先补共享事务或锁方案,否则停止实施。

已废止的备选

  • POST /api/account/change-password废止。
  • 三字段后端请求废止。
  • 成功200及带成功标识响应废止。
  • AUTH_REQUIREDCURRENT_PASSWORD_INVALIDPASSWORD_UNCHANGEDPASSWORD_CHANGE_CONFLICTPASSWORD_UPDATE_UNAVAILABLE等首轮备选命名废止。

Gate R跨角色实现细则 v0.4

本节整合架构、UI、前后端、安全、测试和运维结论,是v0.4唯一接口契约的实现细则。前端、后端和测试已在原队列项完成复评,产品已汇总为整体PASS;若本节与首轮回执冲突,以本节及上方“Gate R v0.4唯一接口契约”为准。

本人改密接口

项目 冻结结论
方法与路径 POST /api/v1/me/password/change
认证身份 仅使用现有受保护API的后端认证上下文;当前实现沿用认证头,禁止从URL、查询参数或请求体接收账号、用户ID、角色、状态或Token
请求体 严格只允许currentPasswordnewPassword两个字符串字段;confirmPassword只在前端校验,不发送后端;出现额外字段返回INVALID_REQUEST
字符口径 新密码按Unicode码点计数,8和64均有效;不裁剪、不规范化两端空格;新旧密码按原始字符串比较
成功响应 204 No Content,设置禁止缓存语义;不返回账号、密码、新Token或其他凭据
账号状态 进入写入临界区后重新读取权威账号状态;未认证、认证失效和停用账号均不得写入
当前密码 后端必须基于临界区内最新状态验证;失败不得写入;当前密码不套用新密码长度规则
原子与并发 本人改密、主管重置和账号停用共享同一账号级凭据写入原语;当前单进程隔离环境采用账号锁加版本/CAS,重叠写入最多一个成功,其余返回冲突;多进程或多写入实例必须停止并另行评审共享事务/CAS
失败语义 校验、临时写入或原子替换任一步失败,原密码和原数据保持不变;禁止自动重试密码写请求
成功退出 后端不签发新凭据;前端清空三字段、当前认证和当前业务态并返回登录页;旧密码失败、新密码成功;完整多设备会话撤销继续延期
主管兼容 保留主管原新建/重置业务语义和授权,接入同一凭据写入原语;本轮不得扩大主管权限或新增第二套直接写密码路径

稳定错误码与页面动作

HTTP 错误码 页面动作
400 INVALID_REQUEST 表单级安全提示;缺字段、类型错误或额外字段
401 AUTHENTICATION_REQUIRED 清空认证与表单,返回登录页并提示重新登录
403 ACCOUNT_DISABLED 清空认证与表单,返回登录页并提示账号不可用
422 CURRENT_PASSWORD_INCORRECT 仅清空并聚焦当前密码字段
422 PASSWORD_LENGTH_INVALID 聚焦新密码字段,提示8至64字符
422 NEW_PASSWORD_SAME_AS_CURRENT 聚焦新密码字段
409 PASSWORD_UPDATE_CONFLICT 清空认证与表单,返回登录页并要求重新认证确认状态
503 PASSWORD_CHANGE_UNAVAILABLE 留在对话框,解除忙碌,固定安全提示;禁止本地回退和自动重试
500 INTERNAL_ERROR 留在对话框并显示固定安全提示,不展示原始响应或堆栈

confirmPassword不进入后端,因此“两次输入不一致”是前端字段错误而不是服务端错误码。所有错误响应只允许稳定代码、安全提示和请求ID,不得包含密码、账号明细、存储状态、堆栈或完整请求内容。

冻结交互规格

  • 入口位于顶部账号操作区、账号标识和退出附近;所有已登录且启用账号可见,不依赖业务权限;不新增侧边导航或URL参数。
  • 模态框按“当前密码—新密码—确认新密码”单列排列,均为密码输入,不预填、不恢复历史值、不持久化;确认字段仅用于前端一致性校验。
  • 打开后焦点进入当前密码;背景不可交互;Tab限制在模态框内;可见标签、错误关联和状态播报齐全,不只依赖颜色。
  • 提交前依次检查必填、Unicode码点8至64、新旧不同和确认一致,聚焦首个错误;当前密码正确性只由后端判断。
  • 提交前同步建立忙碌锁;提交中禁用字段、确认、取消和Esc,重复点击、回车或事件重入最多产生一个请求;失败后允许人工重试,禁止自动重试。
  • 空闲状态下取消或Esc立即清空三字段、错误和临时状态,关闭后焦点回到入口;遮罩点击不关闭。
  • 只有收到明确204才视为成功;随后清空敏感内存和登录状态并返回登录页,显示一次性“密码已修改,请使用新密码重新登录”。
  • 移动端360 CSS像素及以上保持单列、左右至少16像素安全间距、触控目标至少44×44 CSS像素;软键盘下可滚动,无水平溢出。
  • 后端离线、超时和未知响应必须失败关闭,不调用现有本地模拟接口,不写浏览器持久化,不显示成功。

隔离测试环境与计划入口

项目 冻结结论
环境标识 local-isolated-test,固定Windows本机、单后端进程、单写入实例和精确commit
网络 只绑定127.0.0.1时可使用HTTP;任何非本机回环访问必须使用有效HTTPS,禁止忽略证书错误
配置与数据 配置、虚构账号模板和快照只放在已忽略的docs/local/测试环境/;不得引用生产地址、凭据或当前运行数据文件
虚构样本 启用员工A、启用员工B、主管、停用员工和匿名客户端;密码只在运行时注入,不进入文档、命令行、截图或Git
备份与复位 每轮前生成脱敏快照编号和校验值;测试后优先恢复完整快照;复位或校验失败立即停止
计划自动化入口 实现阶段补齐npm run test:password:apinpm run test:password:webnpm run test:password:concurrencynpm run test:password:sensitivenpm run test:password:reset,并将结果映射到十项验收标准
证据 只记录commit、环境ID、运行ID、用例编号、HTTP状态、稳定错误码、并发生效次数、快照校验值和脱敏扫描结论;不保存原始日志、完整请求响应或敏感值

首轮冲突关闭记录

  • confirmPassword只在前端校验;后端新正式会话在原QUEUE-20260717-032确认两字段严格Schema可实施,结论见COLLAB-092。
  • 接口统一为POST /api/v1/me/password/change204 No Content;前端在原QUEUE-20260717-024复评PASS,结论见COLLAB-095。
  • 前端首轮提出的接口、字符口径、错误码与交互分歧均已关闭,原执行锁已释放。
  • 测试首轮提出的事件唯一性、矩阵输入、环境复位和计划命令问题均已关闭;原QUEUE-20260717-027复评PASS,结论见COLLAB-096。
  • 产品通过COLLAB-098汇总七个专业角色最终均PASS,v0.4契约唯一且R-01至R-11无未决分歧;Gate R整体PASS。

Gate R最终结论

角色/汇总 最终结论 结果事件
架构与数据治理 PASS COLLAB-20260717-087
UI与交互设计 PASS COLLAB-20260717-078
前端开发 PASS COLLAB-20260717-095
后端开发 PASS COLLAB-20260717-092
代码审核与安全 PASS COLLAB-20260717-081
测试与质量 PASS COLLAB-20260717-096
运维与发布 PASS COLLAB-20260717-083
产品整体汇总 PASS COLLAB-20260717-098

Gate R通过时只打开“另建精确实现任务”的前置条件,不等于自动授权实现。该时间点功能实现进度为0%,无可审核代码基线,未测试、未部署、不可上线;后续实现与验收结果以本文顶部状态和实现/验收记录为准。

首版明确不改

  • 不做一次性临时密码、强制首次改密、全员轮换和密码找回。
  • 不做完整会话中心、复杂限流、审计平台和认证模块重构。
  • 不清理Git历史,不修改CRM-20260717-002的责任范围。
  • 不因页面改动顺手重构其他账号、权限或客户功能。

后续独立改进

  1. 密码哈希和旧认证机制退役。
  2. 改密、重置和停用后的完整会话撤销。
  3. 主管一次性临时凭据与首次强制改密。
  4. 限流、审计、密码强度和安全告警。
  5. 多设备会话和自助找回能力。

实施停止线

  • Gate N已经PASS,但不等于实现授权。
  • Gate R已经整体PASS,但仍不等于实现授权;必须由Owner/项目管理员另建实现事件、精确队列和可审核基线后才能修改业务代码。
  • 首轮五项契约差异已经由v0.4唯一契约和COLLAB-092、095、096关闭;旧接口、三字段请求、成功200和旧错误码不得恢复。
  • 实现若发现多进程、多写入实例或无法提供账号级原子/CAS,必须停止并重新进入架构评审。
  • 第一阶段只允许部署到隔离测试环境进行验证;当前正式线上环境禁止部署,后续线上发布必须另立授权并通过适用Gate。
  • 员工可以修改他人密码、当前密码错误仍能修改、后端断开却显示成功,任一情况均不得交付。
  • 任何密码值进入URL、接口响应、普通日志或协作文档时立即停止并整改。