Laravel认证中间件故障 已登录用户仍被重定向到登录页
问题原因
两个认证中间件的判断逻辑完全写反,加上路由文件存在语法笔误,才会出现已登录用户被重定向回登录页的问题,具体问题点:
isLoggedIn(对应AuthCheck中间件)逻辑反向:现有代码判断「存在登录Session就跳转登录页」,和「未登录用户才拦截跳转登录页」的需求完全相悖alreadyLoggedIn中间件逻辑反向:现有代码判断「已登录访问登录/注册页才放行,其余情况返回上一页」,和「已登录用户访问登录/注册页直接跳转仪表盘,未登录才放行」的需求完全相悖- 路由定义笔误:
/sign_up路由调用中间件时漏写-符号,存在语法错误
修复方案
1. 修正AuthCheck中间件逻辑
把原有判断条件取反,仅当用户不存在有效登录Session时才拦截跳转,修正后代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; use Illuminate\Support\Facades\Session; class AuthCheck { public function handle(Request $request, Closure $next) { // 无有效登录凭证时拦截 if(!Session::has('loginId')){ return redirect('signin')->with('fail','You have to login first'); } return $next($request); } }
2. 修正AlreadyLoggedIn中间件逻辑
调整分支判断,已登录用户访问登录、注册页时直接跳转客户端仪表盘,未登录用户正常放行访问公共页面,修正后代码:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Http\Request; class AlreadyLoggedIn { public function handle(Request $request, Closure $next) { // 已登录状态访问登录/注册页,直接跳仪表盘 if(Session()->has('loginId') && (url('signin') == $request->url() || url('sign_up') == $request->url())){ return redirect('/client'); } // 未登录正常放行 return $next($request); } }
3. 修复路由语法错误
找到web.php中/sign_up的路由定义,补上缺失的-符号,修正后对应路由段:
Route::post('/signin', [customAuthController::class,'loginClient']); Route::get('/client',[customAuthController::class,'dashboard'])->middleware('isLoggedIn'); Route::get('/signin', [customAuthController::class, 'login'])->middleware('alreadyLoggedIn'); // 原代码此处漏写横杠,修正为 ->middleware Route::get('/sign_up',[customAuthController::class,'registration'])->middleware('alreadyLoggedIn');
校验点
修复完成后确认登录方法loginClient中,账号密码校验通过时执行了两个操作:
- 调用
Session::put('loginId', $登录用户的主键id)存入有效登录凭证 - 校验通过后执行
return redirect('/client')跳转至仪表盘页
内容的提问来源于stack exchange,提问作者Faaiz Aslam
相关产品推荐
相关产品推荐

