【问题标题】:CakePHP Session Timeout on Inactivity onlyCakePHP 会话超时仅在不活动时
【发布时间】:2013-01-22 23:35:53
【问题描述】:

所以这个问题的关键是如何防止 CakePHP 仅在一段时间不活动后取消对会话的身份验证。

所以,如果用户什么都不做,那么我希望 CakePHP 在 30 分钟后将他们注销。但是,如果用户选择在第 28 分钟不活动时访问页面,那么 CakePHP 应该“重置”它的超时计数器。

目前没有发生这种情况。无论活动如何,CakePHP 在我的核心配置 (app/Config/core.php) 中的指定时间后都会超时。

这是我的配置代码:

Configure::write('Session', array(
    'defaults' => 'cake',
    'timeout' => '30'
));

有什么想法吗?

【问题讨论】:

    标签: cakephp authentication session-timeout


    【解决方案1】:

    遇到同样的问题后,我发现这是由 Session.cookieTimeout 值引起的。虽然 php 会话仍然有效,但会话 cookie 上的过期日期不会被刷新。

    现在这是我的会话配置

    Configure::write('Session', array(
            'defaults' => 'php',
            'timeout' => 30, // The session will timeout after 30 minutes of inactivity
            'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
            'checkAgent' => false,
            'autoRegenerate' => true, // causes the session expiration time to reset on each page load
        ));
    

    【讨论】:

    • 如果有人每 20 分钟使用一次该站点,使用此配置 1440 分钟后会发生什么? (即timeout 没有启动)
    • @Matt,它肯定会把用户踢出去!如果您真的相信您的网站上会有 24 小时以上的用户,那么您需要将 cookieTimeout 值扩展为适合您的值,或者通过 PHP 手动延长 cookie 到期时间。
    • 我认为每重新加载几次页面就会延长 1440 分钟,因为 autoRegenerate 设置为 true
    • 遗憾的是没有,这只是延长了 PHP 会话的过期时间,并没有触及 cookie 的过期时间。
    • @MonkeyKing 如果您想无限延长会话,则需要自动重新生成。没有它,会话仍将在 24 小时后过期(或您在 cookieTimeout 中设置的任何内容)。基本上,如果没有 autoRegenerate,您会将 30 分钟的 PHP 会话延长到 1400 分钟的 cookie 超时。
    【解决方案2】:

    虽然timeout 值会在每次浏览时重置并因此提供您需要的“不活动超时”,但浏览器的会话 cookie 到期日期保持不变。

    因此,如果您在第 28 分钟 + 第 35 分钟刷新,虽然 Cake 会话在内部(内部 = Cake 内部)仍然有效,但浏览器最终会在第 30 分钟后删除会话 cookie。

    您可以通过$this->Session->renew() 重置会话 cookie 的到期日期。或者设置autoRegenerate = truerequestCountdown = 1,Cake 会在每次浏览量上更新。

    (但是你必须在每次页面查看时重新生成会话,这有点愚蠢。事实上,如果没有 renew()timeout 值将永远不会发挥作用,因为 cookie 将始终在固定时间过期无论有多少活动,都可以约会。这似乎是一个错误,但我还没有研究过解决方法。)

    【讨论】:

    • 谢谢,这让我很开心。我将代码添加到我的 AppController 的 beforeRender 函数中;似乎很有魅力。
    • 我的应用程序控制器中有一些东西可以使用 setcookie() 重置每个请求的会话 cookie 日期时间。这对我有用,但看起来真的很老套。
    • 我在使用 requestCountdown = 1 和打开同一个 Web 应用程序的多个选项卡时遇到了问题。下一行的几个选项卡请求新选项卡发送现在已过期的 cookie 并因此被注销。
    • 这就是所谓的“竞争条件”。如果在同一页面上触发多个 Ajax 请求,也会发生这种情况。唯一的解决方案是不要在每次浏览量时重新生成(这对大多数人来说“足够好”——除非你处理金钱)。只需每 10 页重新生成一次 - 您的超时时间将是“模糊的”,但至少您不会收到错误消息。如果安全是一个大问题,请参阅security.stackexchange.com/questions/1246/…
    【解决方案3】:

    我遇到了同样的问题,我使用 autoRegenerate 选项解决了它:

    Configure::write(
        'Session',
        array(
            'defaults' => 'cake',
            'timeout' => '30',
            'autoRegenerate' => true
        )
    );
    

    您也可以在 AppController.php 类中使用 $this->Session->renew();,但我最喜欢上述解决方案。

    【讨论】:

    • autoRegenerate 仅在每 10 次(默认情况下)网页浏览中重新生成 sessionid。它与时间没有任何关系。它只计算页面浏览量,纯粹是为了减轻会话窃取攻击。见:book.cakephp.org/2.0/en/development/sessions.html
    • 所以,当我在互联网上搜索更多细节时,我想到了这个解决方案。我的最后一次尝试涉及在 AppController 的 beforeFilter 方法中调用 $this->Session->renew()。不幸的是,这会在用户每次导航到新页面时将其注销。似乎出于某种奇怪的原因,更新会清除会话数据。
    • 我在做同样的事情 Kyle($this->Session->renew() 在 AppController 的 beforeFilter 方法中),它似乎可以运行 2.4.1 stable。
    【解决方案4】:

    Rob Forrest 的答案是正确的

    Configure::write('Session', array(
            'defaults' => 'php',
            'timeout' => 30, // The session will timeout after 30 minutes of inactivity
            'cookieTimeout' => 1440
    ));
    

    cookieTimeout 应该大于 timeout 如果您希望会话仅在不活动时过期,那么您需要将 cookieTimeout 设置为非常大的数字(例如 60*24*10(10 天))

    【讨论】:

    • 同意将cookieTimeout 设置为遥远的未来。会话超时是唯一在页面加载时延长的超时,因此如果没有遥远的未来cookieTimeout,无论用户活动如何,cookie 最终都会过期。
    【解决方案5】:
        Configure::write('Session', array(
        'defaults' => 'cake',
        'timeout' => 1440, // The session will timeout after 30 minutes of inactivity
        'cookieTimeout' => 1440, // The session cookie will live for at most 24 hours, this does not effect session timeouts
        'checkAgent' => false,
        'autoRegenerate' => true, // causes the session expiration time to reset on each page load
    ));
    

    这行得通,尽管会话在几个小时后结束,但仍然比在几分钟内结束要好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-09
      • 1970-01-01
      相关资源
      最近更新 更多