Laravel 11未登录访问认证路由提示Route [login]未定义问题求助
问题
在Laravel 11应用中,未登录状态下访问需要认证的路由时,出现如下错误:
Symfony\Component\Routing\Exception\RouteNotFoundException Route [login] not defined.
已为web和admin两个Guard配置认证中间件,并设置独立登录路由,路由配置如下:
// Web routes Route::get('/web/login', [AuthController::class, 'index'])->name('web.login'); Route::post('/web/login-user', [AuthController::class, 'login']); // Admin routes Route::get('/admin', [AdminController::class, 'loginView'])->name('admin.login'); Route::post('/admin/loginF', [AdminController::class, 'adminLogin']);
config/auth.php中的Guard和Provider配置:
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin' => [ 'driver' => 'session', 'provider' => 'admins', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\Member::class, ], 'admins' => [ 'driver' => 'eloquent', 'model' => App\Models\Admin::class, ], ],
确认web.login和admin.login路由命名正确,但访问需认证路由时仍提示「Route [login] not defined.」,需要自定义重定向解决方案(Laravel 11无内置对应中间件)。
解决方案
问题根源是Laravel默认的auth中间件会强制跳转到名为login的路由,但你没有定义这个路由,而是用了web.login和admin.login。需要针对不同Guard自定义认证中间件来处理重定向:
创建自定义认证中间件
分别为web和admin Guard生成中间件文件:php artisan make:middleware AuthenticateWeb php artisan make:middleware AuthenticateAdmin编写中间件逻辑
编辑app/Http/Middleware/AuthenticateWeb.php,指定web Guard和对应的登录路由:<?php namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; use Illuminate\Http\Request; class AuthenticateWeb extends Middleware { protected function redirectTo(Request $request): ?string { if (! $request->expectsJson()) { return route('web.login'); } return null; } protected function guard($request) { return auth()->guard('web'); } }编辑
app/Http/Middleware/AuthenticateAdmin.php,指定admin Guard和对应的登录路由:<?php namespace App\Http\Middleware; use Illuminate\Auth\Middleware\Authenticate as Middleware; use Illuminate\Http\Request; class AuthenticateAdmin extends Middleware { protected function redirectTo(Request $request): ?string { if (! $request->expectsJson()) { return route('admin.login'); } return null; } protected function guard($request) { return auth()->guard('admin'); } }注册中间件别名
在bootstrap/app.php中注册自定义中间件的别名,方便路由调用:return Application::configure(basePath: dirname(__DIR__)) ->withRouting( web: __DIR__.'/../routes/web.php', commands: __DIR__.'/../routes/console.php', health: '/up', ) ->withMiddleware(function (Middleware $middleware) { $middleware->alias([ 'auth.web' => \App\Http\Middleware\AuthenticateWeb::class, 'auth.admin' => \App\Http\Middleware\AuthenticateAdmin::class, ]); }) ->create();在路由中使用自定义中间件
为不同Guard的需要认证的路由分配对应的中间件:// Web用户认证路由组 Route::middleware('auth.web')->group(function () { Route::get('/web/dashboard', [WebController::class, 'dashboard']); // 其他web认证路由... }); // Admin认证路由组 Route::middleware('auth.admin')->group(function () { Route::get('/admin/dashboard', [AdminController::class, 'dashboard']); // 其他admin认证路由... });
内容的提问来源于stack exchange,提问作者Mimi
相关产品推荐
相关产品推荐

