Laravel 10 控制用户角色时出现过多重定向问题求助
解决管理员角色控制中的「过多重定向」错误
问题原因
你遇到的无限重定向问题核心原因有两个:
- 未处理未登录用户场景:
Auth::user()在用户未登录时会返回null,直接调用->roles会触发报错;同时未登录用户被重定向到admin.login,若该路由也应用了此中间件,会形成循环。 - 中间件误覆盖登录路由:如果
admin.login路由本身被该中间件保护,无admin角色的用户(包括未登录用户)访问登录页时,会被中间件再次重定向到登录页,触发无限循环。
修复方案
1. 修改中间件代码,完善逻辑
更新中间件,先判断用户登录状态,再检查角色,同时避免重定向回受保护的登录页:
public function handle(Request $request, Closure $next): Response { // 优先判断用户是否未登录 if (!Auth::check()) { return redirect(route('admin.login')); } // 已登录用户检查角色 $userRoles = Auth::user()->roles->pluck('name'); if (!$userRoles->contains('admin')) { // 重定向到非管理员可访问的页面(比如首页),而非登录页 return redirect('/'); } return $next($request); }
2. 确保登录路由不应用该中间件
在路由定义时,将登录路由单独剥离,仅给需要管理员权限的路由分组应用中间件:
// 管理员登录路由:不应用admin权限中间件 Route::get('/admin/login', [AdminAuthController::class, 'showLoginForm'])->name('admin.login'); Route::post('/admin/login', [AdminAuthController::class, 'login']); // 管理员权限路由组:仅此处应用中间件 Route::middleware('admin')->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard'); // 其他管理员专属路由... });
3. 可选:优化角色检查逻辑
在User模型中封装角色判断方法,让代码更简洁:
// app/Models/User.php public function isAdmin() { return $this->roles->contains('name', 'admin'); }
之后中间件可简化为:
public function handle(Request $request, Closure $next): Response { if (!Auth::check()) { return redirect(route('admin.login')); } if (!Auth::user()->isAdmin()) { return redirect('/'); } return $next($request); }
内容的提问来源于stack exchange,提问作者seniorlazycoder
相关产品推荐
相关产品推荐

