10 点 05 分把某账号的 report:export 权限移除,10 点 45 分它仍能调导出接口,成功生成 1.2 万行文件。权限表查询已经没有这条记录,Redis 里 perm:user:6612 的 TTL 还剩 2100 秒。乍看像缓存或者权限的锅,追下去往往不是。

redis-cli TTL perm:user:6612
redis-cli DEL perm:user:6612
SELECT COUNT(*) FROM sys_user_permission WHERE user_id = 6612 AND perm_code = 'report:export';

追下去是这么回事:权限回收只删了数据库行,没有删缓存,也没有提升用户权限版本。鉴权读的是缓存里的旧集合,接口照常放行,直到 TTL 自然到期。

「移除权限缓存残留」相关的验证我通常做两遍,改完一次、隔天再看一次,确认不是临时生效。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。

偶发问题先统计频率,一小时几次和一天一次,查法完全不同。

具体做法是,回收权限后同步删缓存 用同一个事务提交后触发;缓存键带权限版本号 版本一变旧键自然失效;定时比对数据库和缓存的权限条数 差一条就刷新。

验收就看一点,移除权限后 10 秒内调导出接口返回 403,Redis 里该用户的权限键已被删除。

作者 9823189