thinkphp路由分组必须显式调用middleware()绑定中间件,否则鉴权不生效;中间件名需与app/middleware.php中注册的别名一致,支持数组顺序执行,且必须返回$next($request)避免静默拦截。

中间件鉴权不会自动生效,必须显式绑定到路由组或具体路由上;没绑就等于没写,哪怕路径是 /admin/user/delete 也拦不住未登录用户直访。
路由组必须用 middleware() 显式挂载中间件
ThinkPHP 的路由组本身不带任何权限逻辑,Route::group('admin', ...) 只是路径前缀,不是安全围栏。你得手动调用 middleware() 方法把鉴权中间件塞进去:
- 正确写法:
Route::group('admin', function() { ... })->middleware('check_auth'); - 错误写法:只写
Route::group('admin', ...),然后指望“在 admin 下就自动受保护” - 中间件名
'check_auth'必须已在app/middleware.php或注解中注册,不能写成类全路径(如\app\middleware\Auth::class),除非你用的是数组注册方式 - 多个中间件可传数组:
->middleware(['check_auth', 'throttle:5,1'])
中间件里拿不到 $request->route() 参数?正常,别硬取
因为中间件执行时路由尚未完成解析,$request->route() 返回空或默认值是预期行为,不是 bug。要读 URL 中的动态段(比如 /article/123 的 123),得走 $request->param('id'),而不是依赖路由对象:
- ✅ 正确:
$id = $request->param('id'); - ❌ 错误:
$id = $request->route()->param('id');(可能触发Call to a member function param() on null) - 需要判断当前是否在 admin 分组下?用
$request->rule()查匹配的路由规则,它比route()更早可用 - 想根据控制器方法做细粒度权限?提取路径:
$path = $request->url()->getPath();,再匹配白名单或查权限表
中间件返回值漏写 return $next($request) 就会静默拦截
ThinkPHP 中间件函数必须每个分支都显式 return,否则末尾隐式返回 null,框架会当成「中断请求」处理——这是最常被忽略的坑:
- ✅ 正确:
if (!Auth::check()) { return redirect('/login'); } return $next($request); - ❌ 危险:
if (!Auth::check()) { abort(403); }(漏了return $next($request),函数结束返回null) - 认证中间件和权限中间件顺序不能错:认证类(如
CheckAuth)必须排在权限类(如CheckPermission)前面,否则$request->getAttribute('user')拿不到用户 - 别在构造函数里尝试读
$request->session(),此时请求还没绑定完成,会为空
真正麻烦的不是写中间件,而是中间件执行时机与路由解析、用户注入、参数提取三者的错位关系——这些点不提前踩一遍,上线后权限放行或误拦都很难定位。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!











