Таймаут сеанса CakePHP только при бездействии
Таким образом, суть этого вопроса заключается в том, как предотвратить CakePHP от деаутентификации сеанса только после периода бездействия.
Итак, если пользователь ничего не делает, то я ожидаю, что CakePHP выйдет из системы через 30 минут. Однако, если пользователь решит посетить страницу на 28-й минуте бездействия, то CakePHP должен "сбросить" счетчик таймаута.
В настоящее время этого не происходит. Независимо от активности, CakePHP тайм-аут после указанного времени в моем ядре конфигурации (приложения/конфигурации/ядра.РНР).
Вот мой конфигурационный код:
Configure::write('Session', array(
'defaults' => 'cake',
'timeout' => '30'
));
Есть идеи?
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 ));
Это работает, хотя сеанс заканчивается через несколько часов, все же лучше, чем через несколько минут.