运营账号同时挂在区域管理员和只读审计两个角色上,区域管理员继承自门店管理员,门店管理员有查看报表的权限。登录后报表页提示 403,把只读审计摘掉反而能进。日志里能对上时间点,这种反而好排。

三个角色合并时用了交集,只要有一个角色没有该权限就被拒。继承链上的权限在加载时又被后一层覆盖,最终生效的是最末端角色的空集合。这一点先确认清楚,后面就不用反复试。

SELECT r.code, p.code FROM role r
JOIN role_permission rp ON rp.role_id = r.id
JOIN permission p ON p.id = rp.perm_id
WHERE r.id IN (12, 27);
-- 期望看到并集 实际只剩交集

这次卡住的地方就在「角色继承优先级」这一环,单独把它拎出来验证,别和其他改动混在同一次发布里。

处理上按这个顺序:把继承链展开成扁平权限码 打印每个角色贡献了哪些;合并规则统一成并集 显式拒绝单独用 deny 列表表示;加一条双角色冲突的用例 覆盖继承两层和三层。

结果对不对很好判断,运营账号登录后报表页返回 200,权限明细接口列出的权限码是 12 和 27 两个角色的并集。

作者 9823189