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

CodeIgniter 4 Shield会话Cookie过期时间未更新问题

CI4 + Shield 实现会话永久保持的解决方案

针对你修改Config\Session.php的expiration和timeToUpdate后,ci_session Cookie仍当日过期的问题,可按以下步骤排查解决:

1. 同步Session的Cookie过期配置

在Config\Session.php中,除了expiration和timeToUpdate,还需确保$cookie数组里的expire参数与过期时长一致:

// Config\Session.php
public $expiration = 31536000; // 365天,单位秒
public $timeToUpdate = 31536000;

public $cookie = [
    'name'     => 'ci_session',
    'expire'   => 31536000, // 必须与expiration保持相同值
    'path'     => '/',
    'domain'   => '',
    'secure'   => false,
    'httponly' => true,
    'samesite' => 'Lax',
];

Shield在处理会话时,可能优先读取cookie['expire']的值,而非仅依赖expiration。

2. 清除浏览器旧Cookie

之前生成的当日过期Cookie仍会在浏览器中生效,需手动清除ci_session Cookie后,重新访问站点触发新Cookie生成。

3. 改用Shield的「记住我」功能(推荐)

直接修改全局会话过期并非Shield的设计最优解,官方推荐使用「记住我」功能实现长期登录:

  • 在Config\Auth.php中配置记住时长:
// Config\Auth.php
public $rememberLength = 31536000; // 365天
  • 登录时传递true参数启用记住我:
// 示例登录代码
$credentials = [
    'email' => $this->request->getPost('email'),
    'password' => $this->request->getPost('password')
];

if ($auth->attempt($credentials, true)) {
    // 登录成功,已启用记住我
    return redirect()->to('/dashboard');
}

此方式会生成独立的remember_cookie,更符合身份验证的安全规范,且不会影响全局会话配置。

4. 检查会话驱动的存储有效性

若使用数据库/Redis等会话驱动,需验证存储中的过期时间是否正确:

  • 数据库驱动:查看ci_sessions表的expire字段值,应为当前时间戳+31536000
  • 若存储的过期时间仍为当日,需确认是否有其他配置文件或代码覆盖了Session的过期设置

内容的提问来源于stack exchange,提问作者Art Siv

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 02:58:17