app.use('/admin', auth);
app.use('/admin', express.static('public/admin'));
app.use('/public', express.static('public'));

安全扫描报 /admin/report.pdf 未登录就能下载。路由里确实加了 auth,但 express.static 挂在它前面,请求静态文件时根本没走到鉴权。这类现象通常不是突然出现的,往前翻半天日志能看到苗头。

追下去是这么回事:中间件按注册顺序串行执行,先命中的 static 直接把文件发出去并结束响应,后面的 auth 不会被执行。app.use 的前缀匹配很宽松,落在静态目录里的接口路径也会被吃掉。

围绕「Express 中间件顺序」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。监控和日志的时间要对上,时区不一致会多绕很大一圈。

临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。

处理上按这个顺序:把鉴权中间件挪到 static 之前 或者只对公开目录挂 static;静态目录不要和接口前缀共用 换个独立路径;在每层中间件里打一行日志 确认请求实际经过的顺序;补一条未登录访问的用例 放进回归。

确认没问题再收工,退出登录再访问 /admin/report.pdf 返回 401 首页静态资源仍然是 200。

作者 9823189