Laravel未登录重定向中间件通过auth()->guard($guard)->guest()判断认证状态,未登录时用redirect()->guest(route('login'))自动保存当前URL至session的url.intended,供登录后redirect()->intended()跳转;需在Kernel.php注册别名'auth',路由或控制器中使用middleware('auth'),并确保登录路由命名为'login'。

在 Laravel 中,未登录重定向中间件的核心逻辑是:检查用户是否已认证(auth()->check()),未登录则重定向到登录页,并可选地保存当前 URL 以便登录后跳回。
创建中间件
运行命令生成中间件:
php artisan make:middleware RedirectIfNotAuthenticated编辑 app/Http/Middleware/RedirectIfNotAuthenticated.php,修改 handle 方法:
public function handle($request, Closure $next, $guard = null)
{
if (auth()->guard($guard)->guest()) {
return redirect()->guest(route('login'));
}
return $next($request);
}
注意:redirect()->guest(...) 是关键——它会自动将当前请求 URL 存入 session 的 url.intended,供后续 redirect()->intended() 使用。
注册中间件别名(可选但推荐)
在 app/Http/Kernel.php 的 $routeMiddleware 数组中添加:
'auth' => \App\Http\Middleware\RedirectIfNotAuthenticated::class,
这样就能像官方 auth 中间件一样使用:->middleware('auth')。
在路由或控制器中使用
- 路由定义中使用:
Route::get('/dashboard', [DashboardController::class, 'index'])
->middleware('auth');
- 控制器构造函数中使用(Laravel 9+ 推荐):
public function __construct()
{
$this->middleware('auth');
}
如需指定 guard(例如用 admin guard):
->middleware('auth:admin')
中间件会自动把 admin 传给 handle 方法的 $guard 参数。
确保登录页路由名为 login
检查 routes/web.php 中登录路由是否命名:
Route::get('/login', [LoginController::class, 'showLoginForm'])->name('login');
若使用 Laravel Breeze / Jetstream,该命名默认存在。名称必须匹配 route('login') 调用,否则重定向失败。











