Laravel未登录用户访问后台仪表盘重定向失败,报Route [login]未定义
解决Laravel后台未登录访问仪表盘时的Route [login]未定义错误
问题情况
用Laravel开发项目,已经搭好后台路由(routes/web.php)、AdminController控制器和仪表盘页面。未登录用户访问/admin/dashboard时,本来想跳转到/admin登录页,结果报错:
Symfony\Component\Routing\Exception\RouteNotFoundException
Route [login] not defined.
http://127.0.0.1:8000/admin/dashboard
登录后的重定向功能正常,问题只出在未登录访问的跳转环节。
问题原因
Laravel默认的auth中间件会自动跳转到名为login的路由,但你后台的登录路由命名是admin.login,不是默认的login,所以中间件找不到对应路由才会报错。
解决方案
方法1:修改默认auth中间件的跳转路由
找到app/Http/Middleware/Authenticate.php文件,修改redirectTo方法,指定后台的登录路由:
protected function redirectTo($request) { if (! $request->expectsJson()) { return route('admin.login'); } }
方法2:给auth中间件自定义跳转逻辑(可选)
如果不想修改全局中间件,也可以在定义后台受保护路由时,添加自定义中间件逻辑:
// 替换原来的auth中间件分组 Route::middleware(['auth', function ($request, $next) { if (!Auth::check()) { return redirect()->route('admin.login'); } return $next($request); }])->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard'); Route::get('/admin/logout', [AdminController::class, 'logout'])->name('admin.logout'); });
额外注意:路由顺序
你的catch-all路由已经放在所有后台路由的最后,这点是对的,确保它不会覆盖其他后台路由。
修改后的完整代码示例
routes/web.php
<?php use Illuminate\Support\Facades\Route; use App\Http\Controllers\SliderController; use App\Http\Controllers\ProjectController; use App\Http\Controllers\AdminController; use Illuminate\Support\Facades\Auth; Route::get('/', function () { $sliders = App\Models\Slider::all(); $projects = App\Models\Project::all(); return view('homepage', compact('sliders', 'projects')); }); Route::get('/projects', [ProjectController::class, 'index'])->name('projects.index'); Route::get('/projects/{slug}', [ProjectController::class, 'show'])->name('projects.show'); // Admin login route Route::middleware('guest')->group(function () { Route::get('/admin', [AdminController::class, 'showLoginForm'])->name('admin.login'); Route::post('/admin', [AdminController::class, 'login'])->name('admin.login.submit'); }); // Admin routes (protected with auth middleware) Route::middleware('auth')->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard'); Route::get('/admin/logout', [AdminController::class, 'logout'])->name('admin.logout'); }); // Catch-all route to redirect unauthorized access to login page Route::get('/admin/{any}', function () { if (Auth::check()) { // 用户已登录,重定向到仪表盘 return redirect()->route('admin.dashboard'); } else { // 用户未登录,重定向到登录页 return redirect()->route('admin.login'); } })->where('any', '.*');
app/Http/Middleware/Authenticate.php
<?php namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; class Authenticate extends Middleware { /** * Get the path the user should be redirected to when they are not authenticated. * * @param \Illuminate\Http\Request $request * @return string|null */ protected function redirectTo($request) { if (! $request->expectsJson()) { // 指定后台登录路由 return route('admin.login'); } } }
内容的提问来源于stack exchange,提问作者Sercan Aslan
相关产品推荐
相关产品推荐

