下午两点把测试账号的角色从编辑改成只读,这个账号在另一个浏览器里继续提交了 6 次修改,全部返回 200。两点半重新登录后才开始报 403。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,登录时把权限码列表序列化进 session,后续请求只读 session 不再查库。降权只改了角色表,没有让已有会话失效,旧快照要等 session 过期才消失。
碰到「会话权限快照」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。别只看报错的最后一行,往上看几行,真正的起因通常在上面。
redis-cli GET spring:session:sessions:9f2c1a redis-cli DEL spring:session:sessions:9f2c1a SELECT perm_version FROM sys_user WHERE id = 7712;
同类问题如果隔一段时间又出现,多半是某个定时任务或重启流程把改动冲掉了。
具体做法是,权限判断每次从缓存读 不落进 session;角色变更后按用户维度踢掉会话 记录一次强制下线;对写操作再加一道实时校验 降权后立即生效。
最后用这个标准收尾,降权后 10 秒内该账号再提交修改返回 403,另一个浏览器被跳回登录页。
