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

Laravel后台控制面板访问出现重定向循环问题求助

Laravel后台权限验证重定向循环问题修复

尝试使用.env文件中保存的密码访问后台控制面板,通过Session验证权限,但访问http://127.0.0.1:8000/admin/时出现重定向循环,相关代码如下:

路由(Routes)

Route::middleware(['admin.login'])->group(function () {
    Route::get('/admin', [AdminLogin::class, 'login'])->name('admin.login');
    Route::post('/admin', [AdminLogin::class, 'loginSubmit'])->name('admin.login.submit');
});

Route::middleware(['admin.panel'])->group(function () {
    Route::get('/admin/news', [NewsController::class, 'index'])->name('admin.news.index');
    Route::get('/admin/news/create', [NewsController::class, 'create'])->name('admin.news.create');
    Route::post('/admin/news/', [NewsController::class, 'store'])->name('admin.news.store');
    Route::get('/admin/news/{news}/edit', [NewsController::class, 'edit'])->name('admin.news.edit');
    Route::put('/admin/news/{news}/update', [NewsController::class, 'update'])->name('admin.news.update');
    Route::delete('/admin/news/{news}/delete', [NewsController::class, 'delete'])->name('admin.news.delete');
});

中间件(Middleware)

OpenAdminLoginWhenPasswordIsNotCorrect

public function handle(Request $request, Closure $next)
{
    $userHasAccessToTheContent = Session::get('userHasAccessToTheContent', false);
    if ($userHasAccessToTheContent === false) {
        return redirect()->route('admin.login');
    } else {
        return $next($request);
    }
}

OpenAdminPanelWhenPasswordIsCorrect

public function handle(Request $request, Closure $next)
{
    $userHasAccessToTheContent = Session::get('userHasAccessToTheContent', false);
    if ($userHasAccessToTheContent === true) {
        return redirect()->route('admin.news.index');
    } else {
        return $next($request);
    }
}

Kernel.php

protected $middlewareAliases = [
    'admin.login' => \App\Http\Middleware\OpenAdminLoginWhenPasswordIsNotCorrect::class,
    'admin.panel' => \App\Http\Middleware\OpenAdminPanelWhenPasswordIsCorrect::class,
];

AdminLogin控制器

<?php

namespace App\Http\Controllers;

use Illuminate\Http\Request;
use Illuminate\Support\Facades\Session;

class AdminLogin extends Controller
{
    public function login()
    {
        return view('admin.login');
    }

    public function loginSubmit(Request $request)
    {
        $password = $request->input('password');
        $expectedPass = config('content.password');
        if (! empty($expectedPass) and $password === $expectedPass) {
            Session::put('userHasAccessToTheContent', true);

            return redirect()->route('admin.login');
        } else {
            return redirect()->route('admin.news.index');
        }
    }
}

NewsController控制器

<?php

namespace App\Http\Controllers;

use App\Models\News;
use Illuminate\Http\Request;

class NewsController extends Controller
{
    public function index()
    {
        $news = News::all();

        return view('admin.index', ['news' => $news]);
    }

    public function create()
    {
        return view('admin.create');
    }

    public function store(Request $request)
    {
        $data = $request->validate(
            [
                'title' => 'required|string',
                'category' => 'required|string',
                'content' => 'required|string',
            ]
        );

        $newArticle = News::create($data);

        return redirect(route('admin.news.index'));
    }

    public function edit(News $news)
    {
        return view('admin.edit', ['news' => $news]);
    }

    public function update(News $news, Request $request)
    {
        $data = $request->validate(
            [
                'title' => 'required|string',
                'category' => 'required|string',
                'content' => 'required|string',
            ]
        );

        $news->update($data);

        return redirect(route('admin.news.index'))->with('success', 'News Updated Successfully');
    }

    public function delete(News $news)
    {
        $news->delete();

        return redirect(route('admin.news.index'))->with('success', 'News Deleted Successfully');
    }
}

问题原因

  1. 中间件逻辑倒置:
    • admin.login中间件要求未登录用户重定向到登录页,但登录页本身受该中间件保护,导致未登录用户访问登录页时,中间件检测到未登录,再次重定向到登录页,形成循环。
    • admin.panel中间件在用户已登录时,强制重定向到后台首页,而后台首页本身受该中间件保护,导致访问后台首页时,中间件反复重定向到自身,引发循环。
  2. 登录控制器跳转错误:登录成功后重定向到登录页,而非后台面板,进一步加剧了逻辑混乱。

修复步骤

1. 修正OpenAdminLoginWhenPasswordIsNotCorrect中间件

让已登录用户访问登录页时自动跳转到后台,未登录用户允许进入登录页:

public function handle(Request $request, Closure $next)
{
    $userHasAccessToTheContent = Session::get('userHasAccessToTheContent', false);
    if ($userHasAccessToTheContent === true) {
        return redirect()->route('admin.news.index');
    }
    return $next($request);
}

2. 修正OpenAdminPanelWhenPasswordIsCorrect中间件

让未登录用户访问后台路由时跳转到登录页,已登录用户正常访问:

public function handle(Request $request, Closure $next)
{
    $userHasAccessToTheContent = Session::get('userHasAccessToTheContent', false);
    if ($userHasAccessToTheContent === false) {
        return redirect()->route('admin.login');
    }
    return $next($request);
}

3. 调整登录控制器跳转逻辑

登录成功跳转到后台首页,失败则返回登录页并提示错误:

public function loginSubmit(Request $request)
{
    $password = $request->input('password');
    $expectedPass = config('content.password');
    if (!empty($expectedPass) && $password === $expectedPass) {
        Session::put('userHasAccessToTheContent', true);
        return redirect()->route('admin.news.index');
    } else {
        return redirect()->route('admin.login')->with('error', '密码错误,请重新输入');
    }
}

内容的提问来源于stack exchange,提问作者jeffri encarnacion

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.08 07:15:56