Laravel 9手动认证时如何修改‘记住我’Cookie有效期?
问题背景
在Laravel 9中未使用Laravel Starter Kit,手动实现登录认证后,尝试通过Auth::setRememberDuration(1000)修改“记住我”Cookie的有效期,但该调用无法生效。当前登录控制器代码如下:
public function auth() { // validation request()->validate([ 'emailOrUsername' => ['required'], 'password' => ['required'] ]); // Check if the user clicks "remember me" in the login form $remember = (request()->remember) ? true : false; // If login using email if (Auth::attempt(['email' => request()->emailOrUsername, 'password' => request()->password], $remember)) { request()->session()->regenerate(); return redirect()->intended('/dashboard'); } // If login using username else if (Auth::attempt(['username' => request()->emailOrUsername, 'password' => request()->password], $remember)) { request()->session()->regenerate(); return redirect()->intended('/dashboard'); } // If incorrect credentials else { return back()->with('errorAlert', 'Maaf, email/username atau password yang anda masukkan salah'); } }
解决方案
方法一:全局配置文件设置(最简单)
Laravel支持通过配置文件直接全局定义“记住我”有效期,无需修改代码逻辑:
- 打开
config/auth.php,找到guards数组下的web配置项,添加remember字段(单位:分钟):
'guards' => [ 'web' => [ 'driver' => 'session', 'provider' => 'users', 'remember' => 1000, // 设置你需要的有效期分钟数 ], ],
- 执行配置缓存刷新,使修改生效:
php artisan config:cache
方法二:登录逻辑中直接操作Guard实例
Auth::setRememberDuration()无效的原因是,Auth门面返回的是代理对象,需要先获取实际的SessionGuard实例,且必须在调用attempt()前设置有效期:
修改后的登录方法代码:
public function auth() { // 验证逻辑保持不变 request()->validate([ 'emailOrUsername' => ['required'], 'password' => ['required'] ]); $remember = request()->has('remember'); // 获取web guard实例并设置有效期 $guard = Auth::guard('web'); $guard->setRememberDuration(1000); // 单位:分钟 // 尝试邮箱登录 if ($guard->attempt(['email' => request()->emailOrUsername, 'password' => request()->password], $remember)) { request()->session()->regenerate(); return redirect()->intended('/dashboard'); } // 尝试用户名登录 else if ($guard->attempt(['username' => request()->emailOrUsername, 'password' => request()->password], $remember)) { request()->session()->regenerate(); return redirect()->intended('/dashboard'); } // 凭证错误 else { return back()->with('errorAlert', 'Maaf, email/username atau password yang anda masukkan salah'); } }
方法三:自定义SessionGuard(进阶场景)
如果需要长期固定自定义规则,或扩展Guard功能,可以创建自定义Guard类:
- 创建
App\Auth\CustomSessionGuard.php:
<?php namespace App\Auth; use Illuminate\Auth\SessionGuard as BaseSessionGuard; class CustomSessionGuard extends BaseSessionGuard { // 重写默认记住我有效期(分钟) protected $rememberDuration = 1000; }
- 在
AuthServiceProvider的boot方法中注册自定义Guard驱动:
use App\Auth\CustomSessionGuard; use Illuminate\Support\Facades\Auth; public function boot() { Auth::extend('custom-session', function ($app, $name, array $config) { $guard = new CustomSessionGuard($name, Auth::createUserProvider($config['provider']), $app->make('session.store'), $app->request); if (method_exists($guard, 'setCookieJar')) { $guard->setCookieJar($app->make('cookie')); } if (method_exists($guard, 'setDispatcher')) { $guard->setDispatcher($app->make('events')); } if (method_exists($guard, 'setRequest')) { $guard->setRequest($app->refresh('request', $guard, 'setRequest')); } return $guard; }); }
- 修改
config/auth.php的webguard驱动为自定义类型:
'guards' => [ 'web' => [ 'driver' => 'custom-session', 'provider' => 'users', ], ],
内容的提问来源于stack exchange,提问作者Mushlih Almubarak
相关产品推荐
相关产品推荐

