Таймаут сеанса CakePHP только при бездействии


Таким образом, суть этого вопроса заключается в том, как предотвратить CakePHP от деаутентификации сеанса только после периода бездействия.

Итак, если пользователь ничего не делает, то я ожидаю, что CakePHP выйдет из системы через 30 минут. Однако, если пользователь решит посетить страницу на 28-й минуте бездействия, то CakePHP должен "сбросить" счетчик таймаута.

В настоящее время этого не происходит. Независимо от активности, CakePHP тайм-аут после указанного времени в моем ядре конфигурации (приложения/конфигурации/ядра.РНР).

Вот мой конфигурационный код:

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

Есть идеи?

5 24

5 ответов:

Столкнувшись с той же проблемой, я обнаружил, что это было вызвано сеансом.значение 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
    ));

В то время как значение timeout сбрасывается при каждом просмотре страницы и, следовательно, обеспечивает требуемый "таймаут бездействия", дата окончания срока действия файлов cookie сеанса браузера остается постоянной.

Таким образом, в то время как сеанс Cake будет внутренне (внутренне = внутренний для Cake) все еще жив, если вы обновились на 28-й минуте + 35-й минуте, браузер в конечном итоге удаляет файл cookie сеанса после 30-й минуты.

Вы можете сбросить дату окончания действия сессионного куки через $this->Session->renew(). Или набор autoRegenerate = true и requestCountdown = 1 и торт будет обновление на каждом просмотре страниц.

(но это довольно глупо, что вам придется заново создавать сеанс на каждой странице просмотра. Как есть, без renew() значение timeout никогда не вступит в игру, потому что срок действия файла cookie всегда будет истекать в фиксированную дату независимо от того, сколько активности. Это похоже на ошибку, но я не искал обходного пути.)

У меня была та же проблема, и я исправил ее, используя опцию autoRegenerate:

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

Вы также можете использовать $this->Session->renew(); в своем классе AppController.php, но это мое любимое решение.

Ответ Роба Форреста-правильный

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 дней ))

    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
));

Это работает, хотя сеанс заканчивается через несколько часов, все же лучше, чем через несколько минут.