You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel 9手动认证时如何修改‘记住我’Cookie有效期?

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支持通过配置文件直接全局定义“记住我”有效期,无需修改代码逻辑:

  1. 打开config/auth.php,找到guards数组下的web配置项,添加remember字段(单位:分钟):
'guards' => [
    'web' => [
        'driver' => 'session',
        'provider' => 'users',
        'remember' => 1000, // 设置你需要的有效期分钟数
    ],
],
  1. 执行配置缓存刷新,使修改生效:
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类:

  1. 创建App\Auth\CustomSessionGuard.php:
<?php

namespace App\Auth;

use Illuminate\Auth\SessionGuard as BaseSessionGuard;

class CustomSessionGuard extends BaseSessionGuard
{
    // 重写默认记住我有效期(分钟)
    protected $rememberDuration = 1000;
}
  1. 在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;
    });
}
  1. 修改config/auth.php的web guard驱动为自定义类型:
'guards' => [
    'web' => [
        'driver' => 'custom-session',
        'provider' => 'users',
    ],
],

内容的提问来源于stack exchange,提问作者Mushlih Almubarak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 10:24:08