Тайм-аут сеанса CakePHP только для бездействия
Таким образом, суть этого вопроса заключается в том, как предотвратить CakePHP от де-аутентификации сеанса ТОЛЬКО после периода бездействия.
Итак, если пользователь ничего не делает, я ожидаю, что CakePHP выйдет из системы через 30 минут. Однако, если пользователь намеревается посетить страницу на 28-й минуте бездействия, то CakePHP должен "reset" использовать счетчик времени ожидания.
В настоящее время этого не происходит. Независимо от активности, CakePHP истекает через указанное время в моей основной конфигурации (app/Config/core.php).
Здесь мой код конфигурации:
Configure::write('Session', array(
'defaults' => 'cake',
'timeout' => '30'
));
Любые идеи?
Ответы
Ответ 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
));
Ответ 2
В то время как значение timeout
сбрасывается на каждом просмотре страницы и, следовательно, обеспечивает требуемый тайм-аут неактивности, дата истечения срока действия cookie сеанса браузера остается постоянной.
Итак, пока сеанс Cake внутри (внутренне = внутренний для Cake) все еще будет живым, если вы обновляетесь на 28-й минуте + 35-й минуте, браузер заканчивает удаление файла cookie сеанса после 30-й минуты.
Вы можете reset истечения срока действия cookie сеанса через $this->Session->renew()
. Или установите autoRegenerate = true
и requestCountdown = 1
, и Cake будет обновляться на каждом просмотре страницы.
(Но это глупо, что вам придется регенерировать сеанс на каждом просмотре страницы. Как и без renew()
, значение timeout
никогда не вступит в игру, потому что cookie всегда истекает на фиксированном дата, независимо от того, сколько активности. Это похоже на ошибку, но я не рассмотрел обходной путь.)
Ответ 3
У меня была такая же проблема, и я исправил ее с помощью опции autoRegenerate
:
Configure::write(
'Session',
array(
'defaults' => 'cake',
'timeout' => '30',
'autoRegenerate' => true
)
);
Вы также можете использовать $this->Session->renew();
в своем классе AppController.php
, но указанное выше решение является моим любимым.
Ответ 4
ответ Роб Форрест является правильным.
Configure::write('Session', array(
'defaults' => 'php',
'timeout' => 30, // The session will timeout after 30 minutes of inactivity
'cookieTimeout' => 1440
));
cookieTimeout должен быть больше таймаута
если вы хотите, чтобы сессия была истекли бездействия, тогда вам нужно установить cookieTimeout для очень большого числа (например, 60 * 24 * 10 (10 дней))
Ответ 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
));
Это работает, хотя сеанс заканчивается через несколько часов, он все же лучше, чем заканчивается в минутах.