SELECT COUNT(*) FROM orders WHERE owner_id = 5521;
-- 列表返回 214 导出文件却是 3860 行
awk -F, 'END{print NR}' export_20260301.csv
销售 A 在订单列表只看到自己名下 214 单,点导出拿到的 CSV 有 3860 行,包含其他销售的客户手机号。列表接口的 SQL 里带 owner_id 条件,导出接口日志里那条 SQL 没有。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。
追下去是这么回事:导出走的是另一套 Mapper,只按时间范围查,行级权限的拼装逻辑写在列表 Service 里,导出 Service 直接调了基础查询。两处各写各的,新加的数据范围规则只补了一边。
「导出绕过行级权限」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。同一份配置存在多处的,先确认改的是被加载的那一份。
新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
处理上按这个顺序:把数据范围条件下沉到 Mapper 的公共片段 两个入口共用;导出改成先查分页再写文件 走和列表完全相同的查询;用两个销售账号各导一次 对比行数和 id 集合。
确认没问题再收工,销售 A 导出的 CSV 行数从 3860 降到 214,和列表的 total 完全一致。
