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'); } }
问题原因
- 中间件逻辑倒置:
admin.login中间件要求未登录用户重定向到登录页,但登录页本身受该中间件保护,导致未登录用户访问登录页时,中间件检测到未登录,再次重定向到登录页,形成循环。admin.panel中间件在用户已登录时,强制重定向到后台首页,而后台首页本身受该中间件保护,导致访问后台首页时,中间件反复重定向到自身,引发循环。
- 登录控制器跳转错误:登录成功后重定向到登录页,而非后台面板,进一步加剧了逻辑混乱。
修复步骤
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
相关产品推荐
相关产品推荐

