# 运营账号管理与旧管理员权限修复 ## 原因与修复 线上原运营管理员具有 `isAdmin=true`、`role=admin`、`roles=[admin]`,账号未停用、资料未丢失;新运营网关只识别 `ops-manager`、`ops-staff`、`ops-auditor`。登录身份与业务权限不一致导致工作台、会员详情报“当前运营角色无权执行该操作”。 管理网关和两个运营网关现在共用 `admin-role-policy.js`:优先读取显式角色,再兼容旧管理员为本帐套运营经理,不升级为超级管理员。显式未知运营角色不会回退获取经理权限。禁用和删除状态仍先于角色校验。当前原会话已可读取工作台与会员资料。 ## 功能入口 `/admin/operator-accounts`,左侧“账号与安全 → 运营账号管理”。 - 按姓名、登录账号、角色和状态查询,20 条一页。 - 新增后台账号、设置姓名与角色;新账号默认选择运营人员。 - 编辑姓名、调整角色、启用或停用账号。 - 重置其他运营账号密码,或者单独退出其全部旧会话。 - 本人的密码仍通过“修改密码”校验原密码后修改。 - 查看每个账号的操作原因、操作者、时间及修改前后信息;审计按页读取。 | 身份 | 管理范围 | | --- | --- | | 运营经理(含旧 admin) | 本帐套运营经理、运营人员、审计员;不能管理或授予超级管理员 | | 运营人员、审计员 | 不开放运营账号管理;继续使用对应角色的业务权限 | | 超级管理员 | 所属帐套中的全部后台角色;技术后台权限保持独立 | 自己不能停用自己或修改自己的角色。账号用停用保留记录,不提供永久删除。角色变更、停用与退出会话在同一数据库事务中撤销旧会话并记录审计。公司锁与事务内操作者重检防止两个经理互相停用造成无人可管理。 ## 底层权限保护 线上验收发现 Parse 用户所有者可以直接更新自定义权限字段,即使新账号设置了私有 ACL。因此增加数据库授权字段保护触发器: - 公共注册不能附带管理员身份。 - 普通用户接口不能修改 roles、role、adminRoleKey、isAdmin。 - 已有运营账号的帐套、身份、启停用状态不可通过普通用户接口更改,也不能直接删除管理员。 - 管理页面调用受控事务 `xs_operator_change`;事务校验实际操作者与目标帐套、权限、自身保护和版本后才写入。 - 密码交给 Parse 哈希;重置先停用并撤销会话,失败提示核对状态再重试。列表及审计不含密码、令牌或哈希。 - 403 权限拒绝不会再强制退出正常的管理会话;401 会话失效仍退出。 维护注意:旧脚本通过 Parse REST 直接创建带管理员标志的用户或修改权限字段会被拒绝。日常开户应调用运营账号管理接口。迁移和隔离测试需要持有 Master Key,由限指定测试用户的一次性云函数执行受控 SQL;`smoke-operator-accounts.mjs` 包含这一流程及精确清理,不应关闭权限保护来运行旧脚本。 ## 验证 - `npm run test:admin:ci`:192 项通过(包含表单、角色限制、重复提交、密码确认与 403 会话保留)。 - `node --test scripts/tests/operator-accounts.test.mjs`:8 项通过(角色兼容、数据库隔离、审计、版本、自身保护、经理互相停用、直接接口越权保护)。 - `npm run test:member-enrollment`:26 项通过。 - `npm run build:admin`、11 个云函数定义校验和 diff 检查通过;已有其他页面样式预算及 CommonJS 警告保留。 - `scripts/smoke-operator-accounts.mjs`:18 项线上验收通过,包含新旧账号登录、真实账号创建、重复账号拒绝、直接 Parse 权限修改拒绝、角色变更、密码新旧有效性、停用和恢复、主动会话撤销、审计及敏感字段检查。 - 输出 `OPERATOR_SMOKE_PASSED`、`OPERATOR_FIXTURES_CLEANED`;只改动独立测试账号,未修改真实管理员的密码和角色数据。 - 真实浏览器验证工作台恢复、账号列表、创建表单、本人角色不可编辑、审计入口、390px 窄屏。含业务资料的截图只保存在本机 `tmp/operator-account-ui/`。 ## 发布 更新前备份三个网关及管理员角色白名单数据至 `tmp/operator-accounts-release-1788963918963/`。迁移脚本为新增的 `OperatorAccountAudit` 注册 Master-only Parse schema,并安装权限事务和触发器;迁移临时用户及临时函数已清理。 管理网关与两个运营网关已更新。前端在本机 4300 服务生效并生成生产构建;尚无本次确认的独立公网前端托管地址,不把本机界面等同于公网前端部署。