修复采购员账号登录并补齐 purchaser 最小权限 #85

Closed
opened 2026-08-25 11:42:33 +08:00 by ila · 3 comments
Owner

原始需求摘要

用户创建采购员账号后,使用 caigou1 登录提示 incorrect Username or Password。本机事实核对发现:现有记录把登录名保存为“采购1”、昵称保存为“caigou1”,且 role_id=0;系统当前只有管理员角色,尚未注册 purchaser 对 GoAuto 接口的 Casbin 权限。用户于 2026-08-25 确认:caigou1 必须是采购员角色,不能临时赋予管理员权限。

目标

  1. 建立可实际登录并访问采购业务的采购员角色,固定角色标识为 purchaser。
  2. 为采购员授予完成日常商品、采集和采购操作所需的最小权限。
  3. 禁止采购员访问或执行系统管理、敏感配置及管理员专属操作。
  4. 修正本机测试账号 caigou1 的登录名、昵称和角色。
  5. 阻止以后创建 role_id=0 的无效账号,并返回普通人能理解的提示。

非目标

  • 不给采购员管理员角色或管理员旁路权限。
  • 不改变 Android Agent、PDD 创建订单及禁止支付边界。
  • 不新增组织、数据行级权限或复杂角色继承。
  • 不在代码、工单、日志或 Wiki 中记录账号明文密码。
  • 不顺带重构 go-admin 整套权限系统。

前置依赖

  • 复用 go-admin 现有登录、角色、菜单和 Casbin 中间件。
  • GoAuto 现有管理员行为和业务规则保持不变。
  • 执行数据库迁移、权限策略写入及账号修正前必须再次取得用户明确确认。

是否可并行

否。角色种子、API 策略、服务端授权、前端可见性和账号数据必须使用同一权限矩阵验证。

子项目影响

  • server/:采购员角色/权限种子或迁移、API 授权边界、用户角色必填校验、测试。
  • web/:新增/编辑用户时角色必选;按角色隐藏管理员专属入口;采购员业务入口保持可用。
  • 数据库:新增或补齐 purchaser 角色及 Casbin 策略;修正本机测试账号。
  • Wiki:更新权限矩阵、角色说明和必要的迁移/验证说明。

已确认权限边界

采购员允许

  • 登录管理端并访问工作台。
  • 读取设备状态,不允许停用设备或吊销 Device Token。
  • 查看和维护 PDD 商品、虾皮商品及其规格映射。
  • 查看 SYB 商品、店铺和同步记录;按既有采购流程进行商品修正/匹配。
  • 查看采集规则和采集任务;创建、重置或删除采集任务。
  • 从 SYB 商品创建采购任务,并查看、重试及执行既有人工采购处理动作。
  • 只读取 AI 匹配是否启用等既有非敏感状态;不得读取或修改密钥。

仅管理员允许

  • 用户、角色、菜单、接口、部门、岗位等系统管理。
  • 设备停用和 Device Token 吊销。
  • SYB 店铺新增、改名、启停和删除。
  • 手动启动 SYB 导入/同步及修改同步配置。
  • AI Provider 地址、模型、API Key、超时等配置和连接测试。
  • 采集规则新增、编辑和删除。
  • 其他现有代码或业务规则明确限定为管理员的操作。

永久禁止

  • 自动支付或任何支付入口。

实施方案

  1. 建立明确的 purchaser 角色种子及 GoAuto API 权限矩阵,不依赖管理员旁路。
  2. 对缺少现有 sys_menu -> sys_api 关系的 GoAuto 路由补充可迁移、可重复执行的权限注册;按 HTTP 方法区分读写权限。
  3. 服务端保留并补齐高风险操作的显式角色校验,不能只依赖前端隐藏。
  4. 前端按角色隐藏管理员专属入口;采购员仍能看到日常业务页面和允许操作。
  5. 用户创建/修改时要求选择有效角色;服务端拒绝 role_id <= 0 或不存在/停用角色。
  6. 数据迁移/修复阶段以事务或可回滚步骤修正测试账号:登录名 caigou1、昵称“采购1”、角色 purchaser;密码只在执行时使用用户已提供值,不写入任何持久文档。
  7. 验证管理员无回归、采购员允许项成功、禁止项返回 403 且页面不暴露入口。

设计证据

复用现有“系统管理 → 用户管理”的新增/编辑用户弹窗和现有 GoAuto 页面,不新增页面或重大交互。新增的角色必选属于现有表单缺陷修复;管理员专属入口按既有角色条件隐藏。无需新增 HTML 原型,但实施前需形成接口权限矩阵并写入本工单。

验收标准

  • caigou1 能用登录名成功登录,身份显示为采购员。
  • 采购员能访问已允许的 GoAuto 页面和接口,能按既有流程创建/重试采购任务。
  • 采购员访问系统管理、设备停用/Token 吊销、SYB 店铺写操作、手动同步、AI 配置写入/测试、采集规则写操作时被服务端拒绝。
  • 管理员原有权限不受影响。
  • 新增用户未选角色时前后端均给出明确提示,数据库不再产生 role_id=0 用户。
  • 不记录明文密码或其他凭据,不改变禁止支付边界。
  • 服务端相关单元/集成测试、Web lint/build 和两角色接口验证通过。
  • 数据库迁移与账号修正只在用户再次确认后执行,并记录不含凭据的影响结果。

风险

  • Casbin 策略遗漏会造成采购员业务 403;策略过宽会越权,必须同时做正向和反向测试。
  • GoAuto 路由目前并非全部由 sys_menu/sys_api 注册,需要避免只修 UI、不修服务端。
  • 账号修正属于数据写入,必须在执行前确认目标唯一性并事务处理。

文档影响

更新 Gitea Wiki 中的业务规则/角色权限说明及必要的部署迁移说明,随后回读 revision 并同步核心镜像。

## 原始需求摘要 用户创建采购员账号后,使用 `caigou1` 登录提示 `incorrect Username or Password`。本机事实核对发现:现有记录把登录名保存为“采购1”、昵称保存为“caigou1”,且 `role_id=0`;系统当前只有管理员角色,尚未注册 `purchaser` 对 GoAuto 接口的 Casbin 权限。用户于 2026-08-25 确认:`caigou1` 必须是采购员角色,不能临时赋予管理员权限。 ## 目标 1. 建立可实际登录并访问采购业务的采购员角色,固定角色标识为 `purchaser`。 2. 为采购员授予完成日常商品、采集和采购操作所需的最小权限。 3. 禁止采购员访问或执行系统管理、敏感配置及管理员专属操作。 4. 修正本机测试账号 `caigou1` 的登录名、昵称和角色。 5. 阻止以后创建 `role_id=0` 的无效账号,并返回普通人能理解的提示。 ## 非目标 - 不给采购员管理员角色或管理员旁路权限。 - 不改变 Android Agent、PDD 创建订单及禁止支付边界。 - 不新增组织、数据行级权限或复杂角色继承。 - 不在代码、工单、日志或 Wiki 中记录账号明文密码。 - 不顺带重构 go-admin 整套权限系统。 ## 前置依赖 - 复用 go-admin 现有登录、角色、菜单和 Casbin 中间件。 - GoAuto 现有管理员行为和业务规则保持不变。 - 执行数据库迁移、权限策略写入及账号修正前必须再次取得用户明确确认。 ## 是否可并行 否。角色种子、API 策略、服务端授权、前端可见性和账号数据必须使用同一权限矩阵验证。 ## 子项目影响 - `server/`:采购员角色/权限种子或迁移、API 授权边界、用户角色必填校验、测试。 - `web/`:新增/编辑用户时角色必选;按角色隐藏管理员专属入口;采购员业务入口保持可用。 - 数据库:新增或补齐 `purchaser` 角色及 Casbin 策略;修正本机测试账号。 - Wiki:更新权限矩阵、角色说明和必要的迁移/验证说明。 ## 已确认权限边界 ### 采购员允许 - 登录管理端并访问工作台。 - 读取设备状态,不允许停用设备或吊销 Device Token。 - 查看和维护 PDD 商品、虾皮商品及其规格映射。 - 查看 SYB 商品、店铺和同步记录;按既有采购流程进行商品修正/匹配。 - 查看采集规则和采集任务;创建、重置或删除采集任务。 - 从 SYB 商品创建采购任务,并查看、重试及执行既有人工采购处理动作。 - 只读取 AI 匹配是否启用等既有非敏感状态;不得读取或修改密钥。 ### 仅管理员允许 - 用户、角色、菜单、接口、部门、岗位等系统管理。 - 设备停用和 Device Token 吊销。 - SYB 店铺新增、改名、启停和删除。 - 手动启动 SYB 导入/同步及修改同步配置。 - AI Provider 地址、模型、API Key、超时等配置和连接测试。 - 采集规则新增、编辑和删除。 - 其他现有代码或业务规则明确限定为管理员的操作。 ### 永久禁止 - 自动支付或任何支付入口。 ## 实施方案 1. 建立明确的 `purchaser` 角色种子及 GoAuto API 权限矩阵,不依赖管理员旁路。 2. 对缺少现有 `sys_menu -> sys_api` 关系的 GoAuto 路由补充可迁移、可重复执行的权限注册;按 HTTP 方法区分读写权限。 3. 服务端保留并补齐高风险操作的显式角色校验,不能只依赖前端隐藏。 4. 前端按角色隐藏管理员专属入口;采购员仍能看到日常业务页面和允许操作。 5. 用户创建/修改时要求选择有效角色;服务端拒绝 `role_id <= 0` 或不存在/停用角色。 6. 数据迁移/修复阶段以事务或可回滚步骤修正测试账号:登录名 `caigou1`、昵称“采购1”、角色 `purchaser`;密码只在执行时使用用户已提供值,不写入任何持久文档。 7. 验证管理员无回归、采购员允许项成功、禁止项返回 403 且页面不暴露入口。 ## 设计证据 复用现有“系统管理 → 用户管理”的新增/编辑用户弹窗和现有 GoAuto 页面,不新增页面或重大交互。新增的角色必选属于现有表单缺陷修复;管理员专属入口按既有角色条件隐藏。无需新增 HTML 原型,但实施前需形成接口权限矩阵并写入本工单。 ## 验收标准 - [ ] `caigou1` 能用登录名成功登录,身份显示为采购员。 - [ ] 采购员能访问已允许的 GoAuto 页面和接口,能按既有流程创建/重试采购任务。 - [ ] 采购员访问系统管理、设备停用/Token 吊销、SYB 店铺写操作、手动同步、AI 配置写入/测试、采集规则写操作时被服务端拒绝。 - [ ] 管理员原有权限不受影响。 - [ ] 新增用户未选角色时前后端均给出明确提示,数据库不再产生 `role_id=0` 用户。 - [ ] 不记录明文密码或其他凭据,不改变禁止支付边界。 - [ ] 服务端相关单元/集成测试、Web lint/build 和两角色接口验证通过。 - [ ] 数据库迁移与账号修正只在用户再次确认后执行,并记录不含凭据的影响结果。 ## 风险 - Casbin 策略遗漏会造成采购员业务 403;策略过宽会越权,必须同时做正向和反向测试。 - GoAuto 路由目前并非全部由 `sys_menu/sys_api` 注册,需要避免只修 UI、不修服务端。 - 账号修正属于数据写入,必须在执行前确认目标唯一性并事务处理。 ## 文档影响 更新 Gitea Wiki 中的业务规则/角色权限说明及必要的部署迁移说明,随后回读 revision 并同步核心镜像。
Author
Owner

实施进度:代码完成,等待本机数据库高风险步骤确认

已完成但尚未写入本机 MySQL:

  • 建立可审计的 GoAuto Admin API 权限矩阵:共 61 条 API,采购员授予其中 48 条。
  • 新增可重复执行迁移:创建/修正 purchaser 角色、登记 GoAuto API,并将采购员 Casbin 策略严格对齐已确认矩阵。
  • 适配当前实际运行表 casbin_rule;未使用 go-admin 遗留但本库不存在的 sys_casbin_rule。
  • 用户新增/修改增加有效启用角色校验,前端角色必选;“用户名称”改为更明确的“登录名”。
  • 移除 PUT /api/v1/sys-user 的 Casbin 排除,防止非管理员绕过系统用户管理权限。
  • 设备停用/Token 吊销、采集规则写操作、SYB 店铺写操作和店铺发现增加管理员显式角色守卫。
  • 采购员界面隐藏设备高风险操作和采集规则写操作,保留只读能力。

已完成验证

  • go test ./...:通过。
  • pnpm lint:通过(仅仓库既有 30 条 warning,0 error)。
  • pnpm build:prod:通过(仅仓库既有 CSS/大包 warning)。
  • git diff --check:通过。

本机 MySQL 只读影响核对

  • 当前 purchaser 角色:0 条。
  • 目标错误账号:1 条,用户 ID 2;当前登录名“采购1”、昵称“caigou1”、role_id=0、已启用。
  • 当前采购员 Casbin 策略:0 条。
  • 运行库实际权限表:casbin_rule。

下一步(尚未执行)

经用户再次确认后:

  1. 在本机 MySQL 执行 #85 迁移,新增采购员角色、GoAuto API 登记和 48 条采购员策略。
  2. 事务修正用户 ID 2:登录名改为 caigou1、昵称改为“采购1”、角色改为新建采购员;保留现有密码散列,不读取或记录明文密码。
  3. 启动/重载服务后验证采购员正向业务接口和管理员专属接口 403。
  4. 更新长期 Wiki、同步镜像、提交并回写证据,工单停在待验收。
## 实施进度:代码完成,等待本机数据库高风险步骤确认 已完成但尚未写入本机 MySQL: - 建立可审计的 GoAuto Admin API 权限矩阵:共 61 条 API,采购员授予其中 48 条。 - 新增可重复执行迁移:创建/修正 `purchaser` 角色、登记 GoAuto API,并将采购员 Casbin 策略严格对齐已确认矩阵。 - 适配当前实际运行表 `casbin_rule`;未使用 go-admin 遗留但本库不存在的 `sys_casbin_rule`。 - 用户新增/修改增加有效启用角色校验,前端角色必选;“用户名称”改为更明确的“登录名”。 - 移除 `PUT /api/v1/sys-user` 的 Casbin 排除,防止非管理员绕过系统用户管理权限。 - 设备停用/Token 吊销、采集规则写操作、SYB 店铺写操作和店铺发现增加管理员显式角色守卫。 - 采购员界面隐藏设备高风险操作和采集规则写操作,保留只读能力。 ### 已完成验证 - `go test ./...`:通过。 - `pnpm lint`:通过(仅仓库既有 30 条 warning,0 error)。 - `pnpm build:prod`:通过(仅仓库既有 CSS/大包 warning)。 - `git diff --check`:通过。 ### 本机 MySQL 只读影响核对 - 当前 `purchaser` 角色:0 条。 - 目标错误账号:1 条,用户 ID 2;当前登录名“采购1”、昵称“caigou1”、`role_id=0`、已启用。 - 当前采购员 Casbin 策略:0 条。 - 运行库实际权限表:`casbin_rule`。 ### 下一步(尚未执行) 经用户再次确认后: 1. 在本机 MySQL 执行 #85 迁移,新增采购员角色、GoAuto API 登记和 48 条采购员策略。 2. 事务修正用户 ID 2:登录名改为 `caigou1`、昵称改为“采购1”、角色改为新建采购员;保留现有密码散列,不读取或记录明文密码。 3. 启动/重载服务后验证采购员正向业务接口和管理员专属接口 403。 4. 更新长期 Wiki、同步镜像、提交并回写证据,工单停在待验收。
Author
Owner

实施完成,等待用户验收

实际结果

  • 本机 MySQL 已执行迁移版本 1786701700000。
  • 新增角色:名称“采购员”、role_key=purchaser、启用、非管理员、全业务数据范围。
  • 已登记 61 条 GoAuto Admin API,purchaser 获得确认矩阵中的 48 条策略。
  • 已事务修正用户 ID 2:
    • 登录名:caigou1
    • 昵称:采购1
    • 角色:采购员(role_id 2)
    • 状态:启用
    • 原密码散列保持不变
  • Supervisor 已重启 goauto-admin-api;8010 返回 HTTP 200,Casbin 策略在迁移后重新加载。
  • 自动支付边界未改变。

安全边界

  • 采购员未获得管理员旁路。
  • 系统管理 API 未授予采购员;同时移除了 PUT /api/v1/sys-user 的历史 Casbin 排除。
  • 设备停用/Token 吊销、采集规则写操作、SYB 店铺写操作和店铺发现有管理员显式角色守卫。
  • Web 对采购员隐藏设备高风险按钮和采集规则写按钮。
  • AI 设置继续只向采购员返回是否启用,保存和连接测试仅管理员可用。

验证

  • go test ./...:通过。
  • pnpm lint:0 error;30 条仓库既有 warning。
  • pnpm build:prod:通过;仅仓库既有 CSS/大包 warning。
  • python dev_scripts/harness.py check --strict:通过。
  • python dev_scripts/harness.py sync --check:通过。
  • Wiki 页面 Business-Rules-and-Glossary 已在线回读,revision:6bad462cbf91d592ba95fbe2003402d20a589cc3。
  • 提交:ae9a9fe,已推送 origin/main。
  • 未在自动化命令或日志中使用明文账号密码;请用户在页面完成最终登录验收。

待用户验收

  1. 使用登录名 caigou1 和原设置密码登录。
  2. 确认能访问商品、SYB、采集任务和采购管理。
  3. 确认看不到系统管理菜单、设备停用/吊销按钮和采集规则写按钮。
  4. 如直接请求管理员专属接口,应收到 403。
## 实施完成,等待用户验收 ### 实际结果 - 本机 MySQL 已执行迁移版本 `1786701700000`。 - 新增角色:名称“采购员”、`role_key=purchaser`、启用、非管理员、全业务数据范围。 - 已登记 61 条 GoAuto Admin API,`purchaser` 获得确认矩阵中的 48 条策略。 - 已事务修正用户 ID 2: - 登录名:`caigou1` - 昵称:采购1 - 角色:采购员(role_id 2) - 状态:启用 - 原密码散列保持不变 - Supervisor 已重启 `goauto-admin-api`;8010 返回 HTTP 200,Casbin 策略在迁移后重新加载。 - 自动支付边界未改变。 ### 安全边界 - 采购员未获得管理员旁路。 - 系统管理 API 未授予采购员;同时移除了 `PUT /api/v1/sys-user` 的历史 Casbin 排除。 - 设备停用/Token 吊销、采集规则写操作、SYB 店铺写操作和店铺发现有管理员显式角色守卫。 - Web 对采购员隐藏设备高风险按钮和采集规则写按钮。 - AI 设置继续只向采购员返回是否启用,保存和连接测试仅管理员可用。 ### 验证 - `go test ./...`:通过。 - `pnpm lint`:0 error;30 条仓库既有 warning。 - `pnpm build:prod`:通过;仅仓库既有 CSS/大包 warning。 - `python dev_scripts/harness.py check --strict`:通过。 - `python dev_scripts/harness.py sync --check`:通过。 - Wiki 页面 `Business-Rules-and-Glossary` 已在线回读,revision:`6bad462cbf91d592ba95fbe2003402d20a589cc3`。 - 提交:`ae9a9fe`,已推送 `origin/main`。 - 未在自动化命令或日志中使用明文账号密码;请用户在页面完成最终登录验收。 ### 待用户验收 1. 使用登录名 `caigou1` 和原设置密码登录。 2. 确认能访问商品、SYB、采集任务和采购管理。 3. 确认看不到系统管理菜单、设备停用/吊销按钮和采集规则写按钮。 4. 如直接请求管理员专属接口,应收到 403。
Author
Owner

用户验收通过并归档

  • 用户于 2026-08-25 明确回复“#85通过验收”。
  • Wiki 任务归档:Task-85-修复采购员账号登录并补齐最小权限
  • 归档 revision:7af1a4a7648eecc45bf17bd368b9814d8dbc230f,已通过 Gitea MCP 在线回读确认。
  • 实现提交:ae9a9fe,已推送 origin/main。
  • 实施完成时的 harness.py check --strict 与 sync --check 均已通过。
  • 本次验收归档时,本地 harness.py 仍读取旧 Gitea 地址并返回 404,因此按 Wiki-first 规则回退使用当前 Gitea MCP 完成归档和在线回读;未修改本机凭据配置。
  • 本工单没有父工单索引需要同步。

关闭 #85。

## 用户验收通过并归档 - 用户于 2026-08-25 明确回复“#85通过验收”。 - Wiki 任务归档:[`Task-85-修复采购员账号登录并补齐最小权限`](https://git.ilapage.cn/OPC/goauto/wiki/Task-85-%E4%BF%AE%E5%A4%8D%E9%87%87%E8%B4%AD%E5%91%98%E8%B4%A6%E5%8F%B7%E7%99%BB%E5%BD%95%E5%B9%B6%E8%A1%A5%E9%BD%90%E6%9C%80%E5%B0%8F%E6%9D%83%E9%99%90.-) - 归档 revision:`7af1a4a7648eecc45bf17bd368b9814d8dbc230f`,已通过 Gitea MCP 在线回读确认。 - 实现提交:`ae9a9fe`,已推送 `origin/main`。 - 实施完成时的 `harness.py check --strict` 与 `sync --check` 均已通过。 - 本次验收归档时,本地 `harness.py` 仍读取旧 Gitea 地址并返回 404,因此按 Wiki-first 规则回退使用当前 Gitea MCP 完成归档和在线回读;未修改本机凭据配置。 - 本工单没有父工单索引需要同步。 关闭 #85。
ila closed this issue 2026-08-25 14:44:30 +08:00
Sign in to join this conversation.
No labels
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: OPC/goauto#85