liuyun 5685a5ce42
Some checks are pending
CI / backend (push) Waiting to run
CI / frontend (push) Waiting to run
feat(auth): 首登强制改密(子模块 + openspec change)
Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-11 21:54:53 +08:00

1.7 KiB
Raw Blame History

1. 数据模型与迁移

  • 1.1 Prisma:User 新增 mustChangePassword(Boolean,非空,默认 false,snake_case 映射 must_change_password)
  • 1.2 生成并部署 migration(migrate dev --create-only + migrate deploy)

2. 认证核心(标志 + 门禁)

  • 2.1 checkUserActive 改为返回 { active, mustChangePassword },user-state 缓存对象加 mustChangePassword
  • 2.2 JwtAuthGuard 加待改密门禁:待改密且非 PATCH /auth/me/password → 403「请先修改初始密码」
  • 2.3 loginTenant 与自动探测登录响应返回 mustChangePassword
  • 2.4 changePassword 成功时清 must_change_password

3. 触发置标记

  • 3.1 CreateUserDto 新增可选 mustChangePassword(默认 true),users.createUser 按入参落库
  • 3.2 users.resetPassword 置 mustChangePassword=true
  • 3.3 initTenant 新增 forcePasswordChange 选项;createTenant 传 true、seed 传 false

4. 前端强制流程

  • 4.1 auth store 新增 mustChangePassword 状态并持久化(sessionStorage)
  • 4.2 api/auth.ts 的 LoginResult 类型扩展 mustChangePassword
  • 4.3 路由守卫拦截:待改密且目标非改密页/登出时重定向改密页
  • 4.4 新增独立改密页(不进布局),改密成功后 reset() + 跳登录页
  • 4.5 用户创建表单新增「首登强制改密」开关(默认勾选),api/user.ts 的 UserUpsertData 扩展 mustChangePassword 并在提交时传参

5. 验证

  • 5.1 后端 build + 单测 + e2e 通过
  • 5.2 前端 type-check 通过
  • 5.3 冒烟测试:创建用户(待改密)→ 登录返回 mustChangePassword=true → 其它接口 403 → 改密成功 → 重新登录正常