Laravel 7.x/8.x 如何简便实现全局强制登录自动跳转?
Laravel 7/8 全站强制登录实现方案
不需要逐个修改控制器、视图或路由定义,通过全局中间件+自定义配置项即可实现需求,步骤如下:
- 第一步:添加开关配置项
打开配置文件config/auth.php,在配置数组中追加自定义开关:
'force_login' => env('FORCE_LOGIN', false),
配置默认值为false,和预期逻辑一致:值为true时强制全站登录校验,值为false时跳过校验。如果需要快速切换,也可以直接在.env文件中添加FORCE_LOGIN=true/false控制。
- 第二步:生成校验中间件
在项目根目录执行artisan命令创建自定义中间件:
php artisan make:middleware ForceLoginMiddleware
打开生成的文件app/Http/Middleware/ForceLoginMiddleware.php,写入以下逻辑,注意头部引入Auth门面:
<?php namespace App\Http\Middleware; use Closure; use Illuminate\Support\Facades\Auth; class ForceLoginMiddleware { public function handle($request, Closure $next) { // 开关关闭时直接放行所有请求 if (!config('auth.force_login')) { return $next($request); } // 已登录用户直接放行 if (Auth::check()) { return $next($request); } // 白名单路由:认证相关页面必须放行,否则会出现重定向死循环 $except = [ 'login', 'register', 'password.*', // 通配符匹配所有找回密码相关路由 ]; if ($request->routeIs(...$except)) { return $next($request); } // 未登录用户跳转至登录页 return redirect()->route('login'); } }
如果后续有不需要登录就能访问的公开页面(比如隐私政策、用户协议页),只需要把对应路由的名称加到$except白名单数组即可。
- 第三步:注册全局中间件
打开app/Http/Kernel.php文件,找到$middlewareGroups属性下的web中间件组,把刚才创建的中间件追加到数组末尾(注意要放在StartSession、ShareErrorsFromSession这类系统中间件之后,否则无法获取登录状态):
protected $middlewareGroups = [ 'web' => [ // 原有系统中间件保持不动 \App\Http\Middleware\EncryptCookies::class, \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class, \Illuminate\Session\Middleware\StartSession::class, // \Illuminate\Session\Middleware\AuthenticateSession::class, \Illuminate\View\Middleware\ShareErrorsFromSession::class, \App\Http\Middleware\VerifyCsrfToken::class, \Illuminate\Routing\Middleware\SubstituteBindings::class, // 追加刚创建的强制登录中间件 \App\Http\Middleware\ForceLoginMiddleware::class, ], 'api' => [ 'throttle:api', \Illuminate\Routing\Middleware\SubstituteBindings::class, ], ];
注意:如果项目开启了配置缓存,修改配置后执行
php artisan config:clear即可生效。该方案完全兼容Laravel 7.x、8.x版本,不需要改动现有业务代码,开关切换无侵入。
内容的提问来源于stack exchange,提问作者Shiping
相关产品推荐
相关产品推荐

