liuyun 1790fb30a8 chore(openspec): archive close-phase-0, sync backend specs to main
- 归档 close-phase-0(RBAC 权限 + 审计/登录日志 + seed 收口)
- 新增主 spec:backend/auth、backend/res、backend/audit、backend/login
- 追踪 sysmgr-nest passwordHash 泄漏修复

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
2026-10-10 23:23:56 +08:00

2.7 KiB
Raw Permalink Blame History

Why

Phase 0 后端已实现认证、10 个域 CRUD、多租户/软删/data_scope 过滤,但有三处「声明未生效」:① @RequirePermissions 已定义却零接口使用,任何登录用户都能增删改任意资源;② sys_audit_log / sys_login_log 只有查询接口、无任何写入点;③ 无 seed 脚本,新 fork 无法一键初始化。这三点是「脚手架」区别于普通 CRUD 的核心价值,fork 出去即是安全漏洞 + 排障盲区。本次收口。

What Changes

  • 三级鉴权真正落地:@Public 不登录 → 无标记仅登录 → @RequirePermissions('domain:action') 登录+权限码;无标记接口默认仅登录。
  • 权限码数据驱动:权限码 = 资源表 api/button 型资源的 code(细粒度 domain:action),登录时聚合进请求上下文,守卫做集合判断。
  • 超管绕过:角色 code=super_admin 绕过权限码校验、data_scope 看全量。
  • 审计日志落库:@AuditLog(domain, action) 装饰器 + 拦截器自动记录写操作(增/删/改)与登录/登出,异步写入,失败不阻塞业务。
  • 登录日志落库:登录成功与失败均记录(失败附原因),含 IP/UA。
  • 新增 seed 脚本:一键初始化租户 touyun、用户 touyun(密码 Touyun@123)、super_admin 角色、全量资源树(菜单+按钮+api)并全授 super_admin。

Capabilities

New Capabilities

  • backend/auth: 三级鉴权执行语义、super_admin 绕过、登录时权限集入上下文
  • backend/res: 资源表作为 RBAC 授权锚点的运行时语义(权限码 = 资源 code,细粒度 domain:action)
  • backend/audit: 审计日志写入(写操作 + 登录/登出,装饰器+拦截器,异步)
  • backend/login: 登录日志写入(成功+失败,IP/UA/失败原因)

Modified Capabilities

(无 —— 本变更不修改 shared 三层主 spec,均为后端新能力)

Impact

  • 后端 sources/sysmgr-nest:
    • 新增 Redis 依赖(ioredis)+ RedisService,权限集存 Redis(key 前缀经 REDIS_KEY_PREFIX 隔离多 fork 项目)
    • auth/:permissions.guard 从 Redis 读权限集与 super 标志做判断;auth.service 登录/刷新时聚合权限码写 Redis
    • resources/ users/ roles/ orgs/ dicts/ configs/ tenants/:写接口挂 @RequirePermissions + @AuditLog;授权变更后删权限缓存
    • 新增审计/登录日志写入服务(统一拦截器)
    • prisma/seed.ts + package.json seed 脚本
  • 无 DB schema 变更(表已存在);无 shared spec 变更。
  • 新增基础设施依赖:Redis(Docker 常驻,key 前缀隔离多项目)。
  • 前端不受影响:权限码由资源表下发,前端菜单/按钮后续按此渲染。