Laravel 8分组中间件异常:登录后访问登录URL仍显示登录页
Laravel 8分组中间件异常修复方案
问题现象
- 已登录状态下访问受保护URL无法正常生效
- 登录后访问登录URL仍显示登录页面
原问题代码
$path=$request->path(); $emailcheck = session()->get('email'); if(!Session::get('email') && $path !=="skc-admin/login"){ //echo Session::get('email'); return redirect('/'); //echo $path; }elseif($path =="skc-admin/login" && Session::get('email') ){ return redirect("skc-admin/dashboard"); } return $next($request);
问题分析
- 路径判断逻辑误差:Laravel的
$request->path()返回的是不带路由前缀的相对路径,如果你的skc-admin是路由组前缀,那登录页的实际路径是login而非skc-admin/login,导致判断失效。 - 硬编码路径不健壮:直接写死路径会导致后续路由结构调整时,中间件逻辑同步失效。
- session调用不统一:代码中混用
session()->get()和Session::get(),虽功能一致,但易引发维护混乱。
修复方案
第一步:给路由命名(推荐做法)
先给登录、仪表盘路由设置名称,避免硬编码路径:
// 登录路由(不要放在受保护的中间件组内) Route::get('skc-admin/login', [AdminController::class, 'login'])->name('admin.login'); // 受保护的路由组 Route::prefix('skc-admin')->middleware('admin.auth')->group(function () { Route::get('dashboard', [AdminController::class, 'dashboard'])->name('admin.dashboard'); // 其他受保护路由 });
第二步:修改中间件代码
public function handle(Request $request, Closure $next) { $isLoggedIn = !empty(session('email')); $isLoginRoute = $request->routeIs('admin.login'); // 未登录且访问非登录页,重定向到首页 if (!$isLoggedIn && !$isLoginRoute) { return redirect('/'); } // 已登录且访问登录页,重定向到仪表盘 if ($isLoggedIn && $isLoginRoute) { return redirect()->route('admin.dashboard'); } return $next($request); }
额外注意事项
- 检查
.env文件的SESSION_DRIVER配置,确保session正常工作(推荐file或database驱动) - 确认中间件已正确注册到
app/Http/Kernel.php的$routeMiddleware数组中:
protected $routeMiddleware = [ // 其他中间件 'admin.auth' => \App\Http\Middleware\AdminAuth::class, ];
内容的提问来源于stack exchange,提问作者Webzy Infotech
相关产品推荐
相关产品推荐

