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

Laravel 11二次登录中间件引发重定向循环问题求助

解决Laravel 11二次登录中间件重定向循环问题

核心问题定位

重定向循环的本质是二次登录页面的路由也被你的中间件拦截了。当用户被重定向到login-second页面时,中间件再次检查二次登录状态,发现未完成,又重定向回该页面,无限往复。

具体修复步骤

1. 修改中间件,排除二次登录路由

在二次登录中间件中添加逻辑,跳过二次登录页面本身的路由判断。示例代码如下:

<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;
use Symfony\Component\HttpFoundation\Response;

class SecondLoginMiddleware
{
    public function handle(Request $request, Closure $next): Response
    {
        // 排除二次登录页面,避免循环
        if ($request->route()->getName() === 'login-second') {
            return $next($request);
        }

        // 检查是否完成二次登录(示例用session存储状态)
        if (!session()->has('second_login_completed')) {
            return redirect()->route('login-second');
        }

        // 检查api_token,无则跳转到普通登录页
        if (!$request->user() || !$request->user()->api_token) {
            return redirect()->route('login');
        }

        return $next($request);
    }
}

2. 给二次登录路由命名

在路由文件中明确二次登录路由的名称,方便中间件识别:

// routes/web.php
use App\Http\Controllers\Auth\SecondLoginController;

Route::get('/login-second', [SecondLoginController::class, 'show'])->name('login-second');
Route::post('/login-second', [SecondLoginController::class, 'store'])->name('login-second.store');

3. 正确注册与应用中间件

  • 在bootstrap/app.php中注册中间件别名,不要全局注册:
// 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([
            'second.login' => \App\Http\Middleware\SecondLoginMiddleware::class,
        ]);
    })
    ->create();
  • 仅给需要二次验证的页面分组应用中间件,不要包含登录相关路由:
// routes/web.php
Route::middleware(['auth', 'second.login'])->group(function () {
    // 这里放置需要二次登录的页面路由,比如 dashboard、用户中心等
    Route::get('/dashboard', [DashboardController::class, 'index'])->name('dashboard');
});

4. 标记二次登录完成状态

在二次登录的提交方法中,验证通过后存入session标记:

// App\Http\Controllers\Auth\SecondLoginController.php
public function store(Request $request)
{
    // 二次登录验证逻辑,比如验证二次密码、验证码等
    $request->validate([
        'second_password' => 'required|string',
    ]);

    // 标记二次登录完成
    session()->put('second_login_completed', true);

    // 重定向到用户原本要访问的页面
    return redirect()->intended(route('dashboard'));
}

5. 登出时清除二次登录状态

在登出逻辑中清除session标记,避免下次登录直接跳过二次验证:

// App\Http\Controllers\Auth\LogoutController.php
public function destroy(Request $request)
{
    Auth::guard('web')->logout();

    $request->session()->invalidate();
    $request->session()->regenerateToken();

    // 清除二次登录状态
    $request->session()->forget('second_login_completed');

    return redirect('/');
}

额外注意点

  • 确保login和login-second路由不在需要二次登录的路由分组内,不受中间件拦截。
  • 若api_token用于API验证,注意区分web路由与api路由的中间件逻辑,避免混淆。

内容的提问来源于stack exchange,提问作者sing tenang

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 06:00:54