SELECT perm_code FROM role_permission WHERE role_id = 15 AND perm_code = 'customer:phone:view';
-- 有权限时导出应保留原文
SELECT COUNT(*) FROM audit_log WHERE action = 'EXPORT_CUSTOMER';

客服主管角色有 customer:phone:view 权限,页面上能看到完整手机号,导出的 Excel 里仍是 138****8000。同一个接口换 JSON 返回是完整的,导出走的是另一条链路。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,脱敏写在全局的 Jackson 序列化器里,只要字段名匹配 phone 就替换,不看当前用户有没有权限。导出用的 EasyExcel 又套了一层自己的脱敏注解,两边规则不一致。

「脱敏与权限冲突」排查到最后往往是很小的一处差异,前面那些复杂猜测可以先放一放。改动写完就同步给同事,下一个人踩同一个坑,成本还是你的。

验证用真实数据走一遍,测试数据太干净,边界情况根本碰不到。

处理上按这个顺序:脱敏判断依赖当前登录人的权限 有权限就跳过;序列化和导出共用一个脱敏组件 只留一处规则;对每个角色各导一次 抽样核对字段。

改完只确认一件事:主管导出的 Excel 里手机号是 11 位完整号码,普通客服导出仍是打码,页面显示不受影响。

作者 9823189