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

36 lines
2.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

## 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 前缀隔离多项目)。
- 前端不受影响:权限码由资源表下发,前端菜单/按钮后续按此渲染。