Laravel 8如何实现登录成功后根据条件跳转至不同路由
Laravel 8 登录后按条件跳转实现方案
1. 核心逻辑修改点说明
你的需求需要调整三处核心逻辑:
- 登录成功后的即时跳转逻辑
- 已登录用户全局状态校验(防止用户手动输入地址绕过修改密码步骤)
- 调整
RedirectIfAuthenticated中间件的默认跳转规则
2. 第一步:重写登录成功跳转逻辑
在app/Http/Controllers/Auth/LoginController.php中添加authenticated方法,该方法会在用户登录验证通过后优先执行:
<?php namespace App\Http\Controllers\Auth; use App\Http\Controllers\Controller; use App\Providers\RouteServiceProvider; use Illuminate\Foundation\Auth\AuthenticatesUsers; use Illuminate\Http\Request; class LoginController extends Controller { use AuthenticatesUsers; // 原有代码保留,新增以下方法 protected function authenticated(Request $request, $user) { if ($user->estado == 2) { // 替换为你实际的密码修改页路由名 return redirect()->route('password.edit')->with('warning', '您当前使用默认密码,请修改后再进行操作'); } return redirect(RouteServiceProvider::HOME); } }
3. 第二步:调整RedirectIfAuthenticated中间件
修改你提供的中间件代码,适配状态判断:
<?php namespace App\Http\Middleware; use App\Providers\RouteServiceProvider; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; class RedirectIfAuthenticated { public function handle(Request $request, Closure $next, ...$guards) { $guards = empty($guards) ? [null] : $guards; foreach ($guards as $guard) { if (Auth::guard($guard)->check()) { // 新增estado状态判断 if (Auth::guard($guard)->user()->estado == 2) { return redirect()->route('password.edit'); } return redirect(RouteServiceProvider::HOME); } } return $next($request); } }
4. 第三步:新增全局校验中间件(必加,避免绕过)
为了防止已登录但estado=2的用户直接输入其他页面地址跳过修改密码,需要新增一个全局校验中间件:
- 执行命令生成中间件:
php artisan make:middleware CheckUserEstado - 编辑
app/Http/Middleware/CheckUserEstado.php:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class CheckUserEstado { public function handle($request, Closure $next) { // 已登录、estado=2、且当前请求不是修改密码/退出路由时跳转 if (Auth::check() && Auth::user()->estado == 2 && !$request->is('password/*') // 替换为你实际的密码修改相关路由前缀 && !$request->is('logout')) { return redirect()->route('password.edit')->with('warning', '请先修改默认密码再操作'); } return $next($request); } }
- 注册中间件到
app/Http/Kernel.php的web中间件组中,添加到\App\Http\Middleware\EncryptCookies::class之后即可:
protected $middlewareGroups = [ 'web' => [ \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // 新增以下行 \App\Http\Middleware\CheckUserEstado::class, // 其他原有中间件保留 ], ];
注意事项
- 上述代码中的
password.edit路由名请替换为你实际的密码修改页路由 - 确保密码修改完成的逻辑中,正确将用户的
estado字段更新为1,避免跳转死循环 - 如果你的密码修改路由前缀不是
password/*,请对应修改CheckUserEstado中间件中的路由排除规则
内容的提问来源于stack exchange,提问作者Diego Utreras
相关产品推荐
相关产品推荐

