| content |
{"Commits":[{"Sha1":"28fda4f95 {"Commits":[{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},{"Sha1":"443dc01bf44b0bb0a93a6e9ff2f715adacb09ab9","Message":"feat(console): 没有管理身份的账号只显示个人账号页\n\n原先只要能登录就渲染管理工作台壳层,只能登录业务应用的普通员工也能看到侧栏、工作台和企业入口(管理数据由后端逐接口拒绝)。增加管理身份门禁,普通员工只保留本人账号安全设置。\n\n实现内容:\n- 新增 shell/admission.ts:平台角色非空直接放行,不发请求;否则逐页读取 /api/v1/me/tenants?limit=100(不只看第一页,偏移上限 100000),任一企业 admin_roles 非空即放行并停止读取;业务应用角色不计入\n- ProtectedRoute 已登录后经 AdminGate:读取中显示加载页,读取失败显示可重试的故障页(不放行也不降级),有管理身份渲染 AppShell,否则渲染 MemberShell;登录、MFA、邮件链接路由不受门禁影响\n- 新增 MemberShell:顶部为“IAM 账号中心”品牌、主题切换与账号菜单,内容为个人中心;不渲染侧栏、上下文切换和命令面板,其他控制台地址一律改到 /me\n- 新增 useOptionalScope;PersonalPage 不在控制台壳层内时隐藏“切换企业”并改用不提管理功能的企业说明\n- layout.css 增加个人账号页顶部条样式与 600px 以下窄屏留白\n- login-handoff.test.tsx 增加 4 项门禁测试,personal.test.tsx 补充 useOptionalScope 模拟\n\n验证:\n- npm run check:Prettier、ESLint、tsc -b、Vitest 36 个文件 314 项、Vite 构建全部通过\n- 新增测试覆盖:普通员工被改到 /me 且企业读两页、第二页才有管理角色时放行、有平台角色时不为门禁读取企业、读取失败可重试\n- 真实员工账号与部署环境浏览器验收:未运行;角色在会话中途被撤销时,界面在下次身份复核或重新登录后才切换,期间仍由后端拒绝管理接口\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:55-07:00"},{"Sha1":"c7966f8b5cfc3fb5a6b26c349ecb7d84b9cb7f30","Message":"fix(console): 认证页品牌与 MFA 提示不再写成进入控制台\n\n从业务应用登录的员工同样经过登录与 MFA 页面,原文案“IAM 控制台”“即可进入控制台”会让人误以为要进入管理后台。改为对两种登录目的都成立的中性说法。\n\n实现内容:\n- AuthShell 顶部品牌字样由“IAM 控制台”改为“IAM 统一身份认证”,同步更新组件注释\n- MFA 页三处副标题由“进入控制台”改为“完成登录”;标题、步骤与按钮不变\n\n验证:\n- npx vitest run:36 个文件 310 项通过;首次全量运行时 group-lifecycle.test.tsx 的“404显示可聚焦完整错误”偶发失败 1 次,该文件单独连续运行 3 次及全量重跑均通过,与本次文案无关\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 浏览器:本机 Vite 开发服务器登录页已显示新品牌字样;服务端渲染的 /login 页面不在本次范围\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:42:20-07:00"},{"Sha1":"a328b990fc462631d30a0a07378f2ee4fe39c0bf","Message":"fix(console): 业务应用登录完成 MFA 后只回跳一次\n\n从业务应用登录并完成 MFA 后,页面会先进入 IAM 控制台首页,过一会儿才回到业务应用。原因是完成回调先刷新身份(状态切到 checking 卸载了 MFA 面板),身份读回后重新挂载的面板拿不到续办地址,把人导航到首页;随后旧回调才整页跳回 /oidc/select,形成两个导航负责人竞争。\n\n实现内容:\n- MfaPage 完成回执带受控续办地址(只接受 /oidc/select?transaction=\u003cuuid\u003e)时,成功标记停留后直接整页跳转,不刷新控制台身份,全程只有这一次导航\n- 没有续办地址(直接登录控制台)时才刷新身份并进入工作台;恢复码仍须勾选已保存后才继续,外部 next 仍不接受\n- AuthProvider 的 refresh 增加 quiet 选项:读取期间不切到 checking,只在拿到结果后一次性更新,避免流程中页面被卸载重挂\n- 新增 login-handoff.test.tsx:用正式路由树与真实 AuthProvider 覆盖已绑定验证、首次绑定并保存恢复码、减少动态效果三种情况\n\n验证:\n- npx vitest run:36 个文件 310 项通过;新增 3 项在 MfaPage 还原为修复前版本时有 2 项失败,能复现原问题\n- npx prettier --check、npx eslint(本次文件)、npx tsc -b:通过\n- 真实账号 MFA 与业务应用全链路浏览器验收:未运行,需重新部署后人工验收\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:41:39-07:00"}],"HeadCommit":{"Sha1":"28fda4f953efc9cdb31bad0fae81ae1b074efce4","Message":"docs(handoff): 补充登录回跳与管理工作台门禁的交接说明\n\n记录演示部署后两个问题的根因、前端修复与验证结果,并整理给后端的部署与改进建议,供 Codex 对照实际项目判断后执行。\n\n实现内容:\n- 说明 MFA 完成后双导航竞争与缺少管理身份门禁两个根因,以及对应的三个前端提交\n- 给后端的建议:重新打包部署控制台、服务端 /login 页品牌文案、可选的统一控制台准入结果接口、可选的 MFA 续办提示\n- 列出部署后人工验收项\n\n验证:\n- 文档内容与 a328b99、c7966f8、443dc01 的实际改动及测试结果逐项核对\n- 文档无可运行检查;未运行\n","AuthorEmail":"gamebyteyu@gmail.com","AuthorName":"starry","CommitterEmail":"gamebyteyu@gmail.com","CommitterName":"starry","Timestamp":"2026-10-16T19:43:06-07:00"},"CompareURL":"pengzhiyu/IAM/compare/0c742655b78b87ea5d7cd9c43028ad20e7527e25...28fda4f953efc9cdb31bad0fae81ae1b074efce4","Len":4}... |