Laravel 12已登录用户访问登录页重定向异常修复方案
问题描述
在Laravel 12项目中,我使用users和admin_users两张表实现多认证体系,对应的User和AdminUser模型均继承Authenticatable。当前存在异常:已登录的普通用户访问http://127.0.0.1:8000/login_jemaat时,系统错误重定向到http://127.0.0.1:8000/admin/login页面,不符合预期。需要修复该问题,让已登录用户访问该地址时直接重定向到http://127.0.0.1:8000/。
相关代码
User模型
class User extends Authenticatable { }
AdminUser模型
class AdminUser extends Authenticatable { }
config/auth.php 配置
<?php return [ 'defaults' => [ 'guard' => env('AUTH_GUARD', 'users'), 'passwords' => env('AUTH_PASSWORD_BROKER', 'users'), ], 'guards' => [ 'users' => [ 'driver' => 'session', 'provider' => 'users', ], 'admin_users' => [ 'driver' => 'session', 'provider' => 'admin_users', ], ], 'providers' => [ 'users' => [ 'driver' => 'eloquent', 'model' => App\Models\User::class, ], 'admin_users' => [ 'driver' => 'eloquent', 'model' => App\Models\AdminUser::class, ], ], 'passwords' => [ 'users' => [ 'provider' => 'users', 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 'expire' => 60, 'throttle' => 60, ], 'admin_users' => [ 'provider' => 'admin_users', 'table' => env('AUTH_PASSWORD_RESET_TOKEN_TABLE', 'password_reset_tokens'), 'expire' => 60, 'throttle' => 60, ], ], 'password_timeout' => env('AUTH_PASSWORD_TIMEOUT', 10800), ];
bootstrap/app.php 配置
->withMiddleware(function (Middleware $middleware) { $middleware->redirectGuestsTo(function (Request $request) { // 如果URL指向dashboard(或其子路径),跳转到管理员登录页 if ($request->is('dashboard') || $request->is('dashboard/*')) { return route('admin.login'); } // 默认跳转到普通用户登录页 return route('pages.login'); }); })
routes/web.php 路由配置
Route::middleware('guest:users')->group(function () { Route::get('/login_jemaat', function () { return view('pages.login'); })->name('pages.login'); Route::get('/register_jemaat', function () { return view('pages.register'); })->name('pages.register'); Route::post('/register_jemaat', [PageController::class, 'register'])->name('register_jemaat'); Route::post('/login_jemaat', [PageController::class, 'login'])->name('login_jemaat'); }); Route::middleware('guest:admin_users')->group(function () { Route::get('/admin/login', [AdminAuthController::class, 'index'])->name('admin.login'); Route::post('/admin/login', [AdminAuthController::class, 'login'])->name('admin.login.submit'); });
解决方案
问题根源是全局中间件未定义已登录用户访问登录页的重定向规则,导致Laravel触发默认逻辑时出现异常跳转。以下是修复步骤:
步骤1:补充全局重定向逻辑
修改bootstrap/app.php中的中间件配置,添加已登录用户的跳转处理:
->withMiddleware(function (Middleware $middleware) { // 未登录用户跳转规则(保留原有逻辑) $middleware->redirectGuestsTo(function (Request $request) { if ($request->is('dashboard') || $request->is('dashboard/*')) { return route('admin.login'); } return route('pages.login'); }); // 已登录用户访问登录页的跳转规则 $middleware->redirectAuthenticatedTo(function (Request $request) { // 普通用户访问自身登录页,跳转到首页 if ($request->is('login_jemaat') && auth()->guard('users')->check()) { return '/'; } // 管理员访问普通用户登录页,跳转到dashboard(可根据实际需求调整) if ($request->is('login_jemaat') && auth()->guard('admin_users')->check()) { return route('dashboard'); } // 管理员访问自身登录页,跳转到dashboard if ($request->is('admin/login') && auth()->guard('admin_users')->check()) { return route('dashboard'); } // 默认跳转首页 return '/'; }); })
步骤2:(可选)路由级自定义重定向
如果不想修改全局中间件,也可以直接在guest:users路由组中添加自定义中间件,强制已登录用户跳转:
Route::middleware(['guest:users', function ($request, $next) { if (auth()->guard('users')->check()) { return redirect('/'); } return $next($request); }])->group(function () { Route::get('/login_jemaat', function () { return view('pages.login'); })->name('pages.login'); Route::get('/register_jemaat', function () { return view('pages.register'); })->name('pages.register'); Route::post('/register_jemaat', [PageController::class, 'register'])->name('register_jemaat'); Route::post('/login_jemaat', [PageController::class, 'login'])->name('login_jemaat'); });
步骤3:验证效果
- 登录普通用户后访问
/login_jemaat,应直接跳转到首页/ - 登录管理员后访问
/admin/login,应跳转到dashboard页面(需确保dashboard路由已定义) - 未登录用户访问dashboard相关路径,正常跳转到管理员登录页;访问其他路径跳转到普通用户登录页
内容的提问来源于stack exchange,提问作者Endricho Folabessy
相关产品推荐
相关产品推荐

