只读账号在页面上只能看,用 Postman 发 POST /api/invoices 返回 201,新建的发票在列表里能查到。同一个账号发 GET 一切正常,权限表里这个角色的动作只有 read。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
SELECT perm_code FROM role_permission WHERE role_id = 9; -- 现在只有 invoice:access UPDATE role_permission SET perm_code = 'invoice:read' WHERE role_id = 9 AND perm_code = 'invoice:access';
权限码只按资源划分,没有区分读和写,接口上配的是 invoice:access。校验通过后不管请求方法是 GET 还是 POST 都放行。这一点先确认清楚,后面就不用反复试。
「只读角色可写入」这类改动最怕改一半,回滚脚本先准备好,再动生产。把复现步骤压到三条以内,交给同事也能跑出来,才算真的定位清楚。
改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。
能分两步做的操作就别合成一步,中间看一眼返回值,出问题好判断。
具体做法是,权限码拆成 resource:read 和 resource:write 两级;写接口统一要求 write 权限 读接口要求 read;用只读账号把写接口全跑一遍 确认都是 403。
改完照着核一遍,只读账号 POST 新建发票返回 403,GET 列表仍是 200,权限明细里只剩 read。
