From 903a423ed517b8b6fc9056d98fcc0dfeef9ef3fd Mon Sep 17 00:00:00 2001 From: QiuSW <105186638@qq.com> Date: Fri, 14 Aug 2026 12:22:39 +0800 Subject: [PATCH] =?UTF-8?q?docs:=20=E5=BD=92=E6=A1=A3=20Sense=20=E7=99=BB?= =?UTF-8?q?=E5=BD=95=E6=9D=83=E9=99=90=E4=BB=BB=E5=8A=A1=20(#64)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/task/64-Sense登录RBAC与审计.md | 77 ++++++++++++++++++++++++ wiki-docs.json | 4 ++ 2 files changed, 81 insertions(+) create mode 100644 docs/task/64-Sense登录RBAC与审计.md diff --git a/docs/task/64-Sense登录RBAC与审计.md b/docs/task/64-Sense登录RBAC与审计.md new file mode 100644 index 0000000..b44210b --- /dev/null +++ b/docs/task/64-Sense登录RBAC与审计.md @@ -0,0 +1,77 @@ + +generated: true (请先修改 Gitea Wiki,禁止直接编辑本文件) +wiki_page: Task-64-Sense登录RBAC与审计 +wiki_url: https://git.ilapage.cn/ila/yovision/wiki/Task-64-Sense%E7%99%BB%E5%BD%95RBAC%E4%B8%8E%E5%AE%A1%E8%AE%A1.- +wiki_revision: 0dd8d90eb90fdab300249ea8a0d2562653bf24e4 +synchronized_at: 2026-08-14T04:20:26Z + + +# 64 Sense登录RBAC与审计 + +- 类型:需求 +- 所属 Epic:#7 +- 所属 MVP / 版本:#8 / Sense MVP +- 状态:待验收 +- 日期:2026-08-14 +- Gitea 工单:https://git.ilapage.cn/ila/yovision/issues/64 +- Pull Request:https://git.ilapage.cn/ila/yovision/pulls/82 +- Wiki 页面:Task-64-Sense登录RBAC与审计 +- Wiki revision:见本地镜像头 + +## 背景与目标 + +工单 #61 只建立了冻结 GoAdmin/go-admin-ui 产品骨架,没有提供可交付的首位管理员初始化、四角色权限边界和完整身份审计。本工单在该基线上重建 Sense 自有登录、用户、角色、菜单/按钮、会话与审计能力,使系统管理员、实施/运维、站点管理员和只读用户具有可自动验证的最小权限,并确保 Sense 不与 Bell 共享账户、JWT 或 Cookie。 + +## 最终方案 + +- 增加公开的 `POST /api/v1/bootstrap`,只接受请求头中的仓库外 `SENSE_BOOTSTRAP_TOKEN`;令牌至少 32 个字符,通过常量时间比较校验,数据库已有任一用户后永久拒绝再次初始化。仓库、迁移和配置模板不包含默认账户、默认密码或有效令牌。 +- PostgreSQL 迁移固定建立 `admin`、`implementation_operator`、`site_admin`、`viewer` 四个角色、菜单映射与 Casbin 最小策略。修复上游角色策略重复写入问题,确保迁移和角色创建可重复执行。 +- JWT realm 固定为 `Sense`;前端 Cookie 使用 `Sense-Admin-Token`,后端仅从 Authorization Bearer 或独立 `sense_session` Cookie 取令牌,不再接受查询参数令牌。 +- 密码策略统一为 6–72 字节,不强制大小写、数字或符号组合,允许全小写;用户创建、管理员重置和本人改密共用同一规则,并修复上游改密重复哈希问题。 +- 登录成功/失败、登出、密码变更和未登录/无权限拒绝同步写入身份审计。通用操作审计递归清除密码、令牌、Cookie、验证码、secret 等字段,对无法结构化的正文不做原文记录。 +- 继续复用 go-admin-ui 的动态菜单、Store、Axios、Layout、权限指令和 Element Plus 通用组件;没有新增通用 UI 组件。配置、接口管理等无关管理路由不注册,即使管理员直接访问也返回 404。 +- 相对建单方案的范围校正:上游迁移真实入口位于 `Sense/server/cmd/migrate/migration/version/`,前端 Cookie 封装位于 `Sense/ui/src/utils/auth.js`;两项均已在工单中先行记录,目标和验收标准未改变。 + +## 修改文件 + +- `Sense/server/app/admin/apis/`、`router/`、`middleware/`:一次性初始化、认证入口、路由保护和身份审计。 +- `Sense/server/app/admin/models/`、`service/`、`dto/`:四角色策略、密码规则、改密与审计脱敏。 +- `Sense/server/cmd/migrate/migration/version/*identity*`:角色、按钮权限、菜单映射与 Casbin 策略迁移。 +- `Sense/server/config/`:独立 JWT/Cookie 安全配置与空白初始化令牌示例。 +- `Sense/ui/src/api/login.js`、`store/`、`utils/auth.js`、用户/角色页面:Sense 会话名称、角色标识、密码校验和移除默认初始密码。 +- 架构、业务规则、本地验证和交付指南 Wiki:身份边界、初始化步骤、角色操作路径与审计要求。 + +## 验收结果 + +| 验收标准 | 结果 | +|---|---| +| Sense 可独立完成首位管理员初始化、登录、登出和密码变更,无默认账户或密码 | 通过 | +| admin、implementation_operator、site_admin、viewer 四角色菜单、按钮和直接 API 权限符合最小边界 | 通过 | +| 密码至少 6 个字符并允许全小写,过短密码被一致拒绝 | 通过 | +| 登录成功/失败、登出、改密和权限拒绝可审计且不记录秘密 | 通过 | +| Sense JWT、Cookie、账户库不与 Bell 共享,查询参数令牌被禁用 | 通过 | +| 无关 GoAdmin 模块没有可见入口或可直接调用的后端路由 | 通过 | +| 复用 go-admin-ui 现有外壳、权限和通用组件,没有重复新增组件 | 通过 | + +## 测试 + +- Go 工具链:`go version go1.26.5 windows/amd64`。 +- 后端:`go test ./...`、`go vet ./...`、`go build ./...` 全通过;新增密码策略、初始化输入/令牌、审计截断和审计脱敏单元测试。 +- 前端:`corepack pnpm@9.15.1 install --frozen-lockfile` 通过;lint 0 error,保留 30 条冻结上游 warning;7 suites / 29 tests 全通过;生产构建通过,保留 6 条冻结上游兼容/体积 warning。 +- PostgreSQL 17 隔离集成:新库迁移后用户 0、角色 4、策略 15;错误初始化令牌 403、正确令牌 200、二次初始化 403;验证码接口 200;未登录直接访问用户接口 401 且有审计。 +- 四角色矩阵:admin 可访问账户和审计;implementation_operator 可查看日志/字典但用户、部门、岗位、角色接口 403;site_admin 可维护用户并读取角色、部门、岗位、字典但日志 403;viewer 上述管理接口均 403。 +- 安全回归:配置/接口管理路由对管理员与站点管理员均 404;短密码返回 400,6 位全小写密码改密及重新登录成功;登录、登出、改密和拒绝审计中没有测试密码或令牌。 +- Wiki 镜像:`python dev_scripts/sync_wiki_docs.py --check` 通过。 +- **未验证部分**:未在真实生产 PostgreSQL、反向代理和目标浏览器执行人工 UI 验收;真实设备业务权限由后续 Sense 工单覆盖。 + +## 遗留问题 + +- 冻结 go-admin-ui 上游仍有 30 条 lint warning 和 6 条构建 warning,本工单不扩大范围清理。 +- 设备、视频接入、媒体服务、实时监看和区域业务权限由后续独立工单在四角色基础上扩展。 +- 登出沿用 GoAdmin 的无状态 JWT 语义,由客户端删除令牌;本工单未增加令牌黑名单或服务端即时吊销机制。 + +## 相关提交 + +- `0411aa3` feat: 重建 Sense 认证权限与审计 (#64) +- `1dd29b6` docs: 记录 Sense 身份权限规则 (#64) +- Pull Request:#82 diff --git a/wiki-docs.json b/wiki-docs.json index cecd275..8cb8c02 100644 --- a/wiki-docs.json +++ b/wiki-docs.json @@ -103,6 +103,10 @@ { "page": "Task-61-Sense冻结GoAdmin源码产品骨架", "path": "docs/task/61-Sense冻结GoAdmin源码产品骨架.md" + }, + { + "page": "Task-64-Sense登录RBAC与审计", + "path": "docs/task/64-Sense登录RBAC与审计.md" } ] }