Clone
3
Task-64-Sense登录RBAC与审计
ila edited this page 2026-08-14 14:20:22 +08:00
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.

64 Sense登录RBAC与审计

  • 类型:需求
  • 所属 Epic:#7
  • 所属 MVP / 版本:#8 / Sense MVP
  • 状态:已完成
  • 日期:2026-08-14
  • 验收:2026-08-14,用户明确回复“#64 验收通过”
  • Gitea 工单:#64
  • Pull Request:#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