thinkphp 6.x安全中间件执行顺序由config/middleware.php中数组索引决定,请求阶段从上到下执行:forcehttpsmiddleware须置顶,validatepostsize紧随其后,parsejsonbody/verifycsrftoken必须在authmiddleware之前,auth与权限校验需连续靠前,logger应靠后;路由级安全中间件须用->middleware()显式绑定,禁用注解;所有校验类中间件的return $next($request)必须置于handle()末尾以确保前置拦截。

安全中间件必须在请求解析完成前拦截,否则可能漏验、误放或读不到原始数据——比如 AuthMiddleware 放在 ParseJsonBody 后面,就拿不到 JSON body;CorsMiddleware 放在 SessionInit 前面,就写不了 Cookie。
全局安全中间件必须按依赖链排在 app/middleware.php 里
ThinkPHP 6.x 只认 config/middleware.php 中的 middleware 数组(不是 app/middleware.php,后者已废弃),顺序决定请求阶段执行先后:
-
ForceHttpsMiddleware应放在最前——它不依赖任何 request 属性,且需在所有解码/鉴权前强制跳转 -
ValidatePostSize::class必须紧随其后,防止大文件上传绕过后续校验 -
ParseJsonBody::class或VerifyCsrfToken::class要在AuthMiddleware之前,否则$request->post()为空或 CSRF token 已被消费 -
AuthMiddleware::class和CheckPermission::class必须连续且靠前,不能被日志、语言包等中间件隔开 - 别把
Logger::class放太前——它需要完整上下文(如 controller/action),应靠近末尾
路由级安全中间件要用 ->middleware() 显式绑定,不能靠注解
@middleware 注解在 v6+ 默认关闭,且解析延迟、IDE 不识别、无法调试——生产环境禁用:
- 登录、注册、密码重置等免鉴权路由,必须用
->withoutMiddleware()显式排除全局AuthMiddleware,而不是“指望它不生效” - 敏感操作路由(如
/api/v1/user/delete)应叠加多层校验:->middleware([JwtAuth::class, CheckScope::class, RateLimit::class]) - 多个
->middleware()链式调用时,越靠前的方法越先执行(请求阶段),顺序错会导致权限检查晚于日志记录 - 不要在路由分组里混用
->middleware()和->append()——append()是运行时插入,缓存后失效,热更新不触发重载
$next($request) 的位置决定它是“拦还是兜”,安全逻辑必须前置
中间件是否起效,不看注册顺序,而看 handle() 里 $next() 调用时机:
- 所有校验类中间件(如鉴权、CSRF、IP 白名单)必须把
return $next($request);放在最后——前面的if判断失败就直接return response()->deny() - 若写成
$next($request); return response()->success();,控制器会先执行,再返回 success,完全失去拦截意义 - 读原始 body(如 JWT token 在 header 或 raw JSON)必须用
$request->getContent(),且只能在第一个中间件里调一次;后续要用$request->withAttribute('token', $val)透传 - 别在安全中间件里调
$request->param()做校验——它自动合并 GET/POST,可能被恶意参数覆盖;应明确用$request->header('authorization')或$request->post('token')
常见静默失败点:顺序对了,但中间件本身没加载或被跳过
执行顺序没错,但安全中间件压根没跑,通常卡在这几个地方:
-
config/middleware.php文件存在,但middleware键下数组是空的、或写成了['auth' => AuthMiddleware::class](键值对写法不支持,报Invalid middleware definition) - 中间件类命名空间错误,比如写成
app\http\middleware\Auth,但实际路径是app/middleware/Auth.php,对应命名空间应为app\middleware\Auth - 用了 Swoole 模式却在中间件构造函数里写了
file_get_contents,导致进程阻塞、后续中间件超时跳过 -
AuthMiddleware里用了session('user_id'),但SessionInit::class没注册或排在它后面——session 数据根本没初始化 - 多应用模式下,安全中间件只配在根
config/middleware.php,但路由走的是app/admin/route.php,得去app/admin/config/middleware.php单独配
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











