You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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的用户直接输入其他页面地址跳过修改密码,需要新增一个全局校验中间件:

  1. 执行命令生成中间件:php artisan make:middleware CheckUserEstado
  2. 编辑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);
    }
}
  1. 注册中间件到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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.04 08:51:00