-
feat: 迁移认证与账号管理模块,并修复权限异常被吞成 500 的缺陷 · f86e1024
NestJS 侧新增(backend-nest/src/auth、src/system-user) - 登录、登出、当前身份、CSRF 四个认证接口 - 账号管理六个接口:列表、新建、改角色与权限、重置密码、锁定列表、解除锁定 - 会话校验含 auth_version 比对,改密码后由数据库触发器自增该值使旧令牌立即失效 - 登录锁定:20 次失败锁 24 小时,锁定期内继续尝试不延长,窗口外重新计数 - 页面权限计算:管理员固定全 EDIT,其余角色以库中配置逐项覆盖 登录恒定耗时的实现差异(有意) Java 一请求一线程,用 Thread.sleep 补齐无副作用;Node 单线程若同步阻塞会卡死整个进程, 因此改为异步 bcrypt 加 setTimeout 补齐。实测两边失败路径耗时差异均在 10ms 内, 成功抹平库中 cost 10 与 cost 12 哈希之间约 168ms 的天然差距。 修复 Java 侧缺陷:Service 层权限异常返回 500 GlobalExceptionHandler 缺少 AccessDeniedException 的处理,过滤器链之外抛出的权限异常 落入兜底分支变成 500「服务器处理失败」。实际后果是普通角色打开无权限页面时, 看到的是服务器错误提示而非「没有页面权限」,会被误判为系统故障。 补充处理器后返回 403 与具体原因。Java 测试 114/114 仍全绿,契约快照 31/31 无变化。 对拍结果 - 认证 4 个接口:CSRF Cookie 属性、401/403 文案、登录响应(键排序后)全部一致 - 账号管理 6 个接口:13 项断言全部一致 其他 - pagePermissions 的字段顺序不作为契约:Java 用 Map.of 构建,迭代顺序取决于 JVM 启动时的随机哈希种子,实测重启前后会变;比对时对象键先排序,数组顺序仍严格比对 - CSRF cookie 在已认证 GET 后被 Spring 删除的行为不予复现,理由记于 CONTRACT-NOTES 第 14 条 - 新增两项迁移后需求:超管可重置低于自己角色的密码、账号操作审计日志 Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
DaiJiezhang authored
Analyzing file…
×