docs: 归档 Sense 登录权限任务 (#64)

This commit is contained in:
QiuSW
2026-08-14 12:22:39 +08:00
parent 1dd29b68fc
commit 903a423ed5
2 changed files with 81 additions and 0 deletions
+77
View File
@@ -0,0 +1,77 @@
<!-- gitea-wiki-mirror:start -->
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
<!-- gitea-wiki-mirror:end -->
# 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
+4
View File
@@ -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"
}
]
}