Laravel 5.6多中间件路由不生效问题求助
你遇到的问题根源在于**Route::middleware()方法的参数使用错误**——这个方法只接受一个包含中间件的数组作为参数,而你传递了两个独立的数组。Laravel会只处理第一个数组里的中间件,直接忽略第二个参数,所以才会出现只有auth和moderator生效的情况。
而且从你的中间件逻辑来看,你应该是希望已认证的用户,只要是管理员(admin)或版主(moderator)中的任意一种,就能访问/dashboard路由。如果直接把两个中间件放到同一个数组里(['auth', 'moderator', 'admin']),会变成要求用户同时满足两个角色,这显然不是你想要的效果。
下面给你两种可行的解决方案:
方案一:创建组合中间件(推荐)
这种方式更清晰,也方便后续复用这个权限判断逻辑:
生成新的中间件:
运行Artisan命令创建中间件:php artisan make:middleware CheckAdminOrModerator编写中间件逻辑:
在app/Http/Middleware/CheckAdminOrModerator.php中,修改handle方法:public function handle($request, Closure $next) { $user = $request->user(); // 判断用户是admin或moderator即可通过 if ($user && in_array($user->role, ['admin', 'moderator'])) { return $next($request); } // 不满足条件则重定向到首页 return redirect('/'); }注册中间件:
在app/Http/Kernel.php的$routeMiddleware数组中添加:'admin-or-moderator' => \App\Http\Middleware\CheckAdminOrModerator::class,修改路由:
现在路由可以简化成:Route::middleware(['auth', 'admin-or-moderator'])->group(function() { Route::get('/dashboard', function() { return view('dashboard'); }); });
方案二:调整现有中间件逻辑(无需新建文件)
如果你不想新增中间件,可以修改其中一个中间件的逻辑,让它支持判断多个角色:
比如修改Moderator中间件(或者Admin中间件,选一个即可):
public function handle($request, Closure $next) { $user = $request->user(); // 同时支持admin和moderator角色 if ($user && in_array($user->role, ['admin', 'moderator'])) { return $next($request); } return redirect('/'); }
然后路由只需要使用auth加上修改后的中间件即可:
Route::middleware(['auth', 'moderator'])->group(function() { Route::get('/dashboard', function() { return view('dashboard'); }); });
为什么原来的写法不行?
再强调一下:Route::middleware()的签名是middleware(array $middleware),它只接受一个数组参数。你之前的写法Route::middleware(['auth', 'moderator'], ['auth', 'admin'])相当于传递了两个参数,Laravel会忽略第二个参数,所以只有第一个数组里的中间件会被执行。
内容的提问来源于stack exchange,提问作者Bikash Gurung

