用户创建采购员账号后,使用 caigou1 登录提示 incorrect Username or Password。本机事实核对发现:现有记录把登录名保存为“采购1”、昵称保存为“caigou1”,且 role_id=0;系统当前只有管理员角色,尚未注册 purchaser 对 GoAuto 接口的 Casbin 权限。用户于 2026-08-25 确认:caigou1 必须是采购员角色,不能临时赋予管理员权限。
caigou1
incorrect Username or Password
role_id=0
purchaser
否。角色种子、API 策略、服务端授权、前端可见性和账号数据必须使用同一权限矩阵验证。
server/
web/
sys_menu -> sys_api
role_id <= 0
复用现有“系统管理 → 用户管理”的新增/编辑用户弹窗和现有 GoAuto 页面,不新增页面或重大交互。新增的角色必选属于现有表单缺陷修复;管理员专属入口按既有角色条件隐藏。无需新增 HTML 原型,但实施前需形成接口权限矩阵并写入本工单。
sys_menu/sys_api
更新 Gitea Wiki 中的业务规则/角色权限说明及必要的部署迁移说明,随后回读 revision 并同步核心镜像。
已完成但尚未写入本机 MySQL:
casbin_rule
sys_casbin_rule
PUT /api/v1/sys-user
go test ./...
pnpm lint
pnpm build:prod
git diff --check
经用户再次确认后:
1786701700000
role_key=purchaser
goauto-admin-api
python dev_scripts/harness.py check --strict
python dev_scripts/harness.py sync --check
Business-Rules-and-Glossary
6bad462cbf91d592ba95fbe2003402d20a589cc3
ae9a9fe
origin/main
Task-85-修复采购员账号登录并补齐最小权限
7af1a4a7648eecc45bf17bd368b9814d8dbc230f
harness.py check --strict
sync --check
harness.py
关闭 #85。
No dependencies set.
The note is not visible to the blocked user.
原始需求摘要
用户创建采购员账号后,使用
caigou1登录提示incorrect Username or Password。本机事实核对发现:现有记录把登录名保存为“采购1”、昵称保存为“caigou1”,且role_id=0;系统当前只有管理员角色,尚未注册purchaser对 GoAuto 接口的 Casbin 权限。用户于 2026-08-25 确认:caigou1必须是采购员角色,不能临时赋予管理员权限。目标
purchaser。caigou1的登录名、昵称和角色。role_id=0的无效账号,并返回普通人能理解的提示。非目标
前置依赖
是否可并行
否。角色种子、API 策略、服务端授权、前端可见性和账号数据必须使用同一权限矩阵验证。
子项目影响
server/:采购员角色/权限种子或迁移、API 授权边界、用户角色必填校验、测试。web/:新增/编辑用户时角色必选;按角色隐藏管理员专属入口;采购员业务入口保持可用。purchaser角色及 Casbin 策略;修正本机测试账号。已确认权限边界
采购员允许
仅管理员允许
永久禁止
实施方案
purchaser角色种子及 GoAuto API 权限矩阵,不依赖管理员旁路。sys_menu -> sys_api关系的 GoAuto 路由补充可迁移、可重复执行的权限注册;按 HTTP 方法区分读写权限。role_id <= 0或不存在/停用角色。caigou1、昵称“采购1”、角色purchaser;密码只在执行时使用用户已提供值,不写入任何持久文档。设计证据
复用现有“系统管理 → 用户管理”的新增/编辑用户弹窗和现有 GoAuto 页面,不新增页面或重大交互。新增的角色必选属于现有表单缺陷修复;管理员专属入口按既有角色条件隐藏。无需新增 HTML 原型,但实施前需形成接口权限矩阵并写入本工单。
验收标准
caigou1能用登录名成功登录,身份显示为采购员。role_id=0用户。风险
sys_menu/sys_api注册,需要避免只修 UI、不修服务端。文档影响
更新 Gitea Wiki 中的业务规则/角色权限说明及必要的部署迁移说明,随后回读 revision 并同步核心镜像。
实施进度:代码完成,等待本机数据库高风险步骤确认
已完成但尚未写入本机 MySQL:
purchaser角色、登记 GoAuto API,并将采购员 Casbin 策略严格对齐已确认矩阵。casbin_rule;未使用 go-admin 遗留但本库不存在的sys_casbin_rule。PUT /api/v1/sys-user的 Casbin 排除,防止非管理员绕过系统用户管理权限。已完成验证
go test ./...:通过。pnpm lint:通过(仅仓库既有 30 条 warning,0 error)。pnpm build:prod:通过(仅仓库既有 CSS/大包 warning)。git diff --check:通过。本机 MySQL 只读影响核对
purchaser角色:0 条。role_id=0、已启用。casbin_rule。下一步(尚未执行)
经用户再次确认后:
caigou1、昵称改为“采购1”、角色改为新建采购员;保留现有密码散列,不读取或记录明文密码。实施完成,等待用户验收
实际结果
1786701700000。role_key=purchaser、启用、非管理员、全业务数据范围。purchaser获得确认矩阵中的 48 条策略。caigou1goauto-admin-api;8010 返回 HTTP 200,Casbin 策略在迁移后重新加载。安全边界
PUT /api/v1/sys-user的历史 Casbin 排除。验证
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:通过。Business-Rules-and-Glossary已在线回读,revision:6bad462cbf91d592ba95fbe2003402d20a589cc3。ae9a9fe,已推送origin/main。待用户验收
caigou1和原设置密码登录。用户验收通过并归档
Task-85-修复采购员账号登录并补齐最小权限7af1a4a7648eecc45bf17bd368b9814d8dbc230f,已通过 Gitea MCP 在线回读确认。ae9a9fe,已推送origin/main。harness.py check --strict与sync --check均已通过。harness.py仍读取旧 Gitea 地址并返回 404,因此按 Wiki-first 规则回退使用当前 Gitea MCP 完成归档和在线回读;未修改本机凭据配置。关闭 #85。