审计角色只配了 order:* 用来查订单,用它调 DELETE /api/orders/991 返回 200。权限明细里没有 order:delete,但接口上的校验通过了。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,通配符的实现是拿配置里的字符串做 startsWith 判断,order:* 去掉星号后变成 order: 前缀,任何以它开头的权限码都算命中。星号被当成了普通的截断符号。
「权限通配符匹配」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。报错里带路径的,先去看那个路径在不在、权限对不对。
SELECT role_id, perm_code FROM role_permission WHERE perm_code LIKE '%*%'; -- order:* 命中 order:delete 说明匹配规则过宽 SELECT id, perm_code FROM sys_permission WHERE perm_code LIKE 'order:%';
同一份配置存在多处的,先确认改的是被加载的那一份。新版本先放一台机器上跑一天再全量,问题一般在这段时间暴露。
备份不是备了就行,恢复一次才算数,很多备份文件打开才发现是空的。
具体做法是,通配符改成按段匹配 每段用正则全等;只允许末段用星号 中间段不允许;把所有含星号的权限逐条跑一遍 打印实际命中的接口。
最后用这个标准收尾,审计角色调删除接口返回 403,order:* 只命中 order:view 和 order:list 两个只读动作。
