Я работаю над приложением, в котором размещается несколько подпрограмм, и я хотел бы реализовать автоматический выход из системы после 30 минут бездействия. У меня есть AuthController с действиями входа и выхода, сопоставленными с пользовательскими / логинскими и / или выходными маршрутами, используя Bootstrap.php, а также плагин переднего контроллера, который выглядит следующим образом:
class Plugin_SessionTrack extends Zend_Controller_Plugin_Abstract { public function preDispatch(Zend_Controller_Request_Abstract $request) { $employeeSession = new Zend_Session_Namespace('employeeSession'); $employeeSession->setExpirationSeconds(10); } }
Я новичок в PHP и Zend, что именно происходит с сеансом через 10 секунд? У меня он установлен для тестирования. Я бы хотел, чтобы время последнего запроса через плагин переднего контроллера было больше 30 минут назад, уничтожить сеанс и вывести пользователя из системы и перенаправить его в / login.
Я вижу, очевидно, что я не отслеживаю время последнего запроса, но я надеюсь, что setExpirationSeconds будет обновляться каждый раз, когда у пользователя будет запрос через этот метод preDispatch.
Может быть, печенье нужно использовать? Мне не нужно фактически инициировать действие выхода из системы, его можно просто обработать при следующем запросе пользователя, если они ничего не сделали за последние полчаса, сеанс был уничтожен, и они вышли из системы, что означает если я уйду в течение 45 минут, мой экран по-прежнему выглядит одинаково, но если я нажму ссылку или попробую отправить форму, которую я получил, она отправит меня в / login. Я могу беспокоиться о некотором предупреждении обратного отсчета JS позже.
Изменить: вот мой загрузочный лоток, если кто-то хочет его увидеть:
class Bootstrap extends Zend_Application_Bootstrap_Bootstrap { /** * Custom routes: * * /login * /logout */ protected function _initRoutes() { $router = Zend_Controller_Front::getInstance()->getRouter(); $loginRoute = new Zend_Controller_Router_Route('login', array('controller' => 'auth', 'action' => 'login')); $logoutRoute = new Zend_Controller_Router_Route('logout', array('controller' => 'auth', 'action' => 'logout')); $routesArray = array('login' => $loginRoute, 'logout' => $logoutRoute); $router->addRoutes($routesArray); } protected function _initPlugins() { $frontController = Zend_Controller_Front::getInstance(); $frontController->registerPlugin(new Plugin_SessionTrack()); } }
Когда вы вызываете Zend_Session::setExpirationSeconds(10)
, на самом деле ничего не происходит на самом сеансе через 10 секунд.
Этот вызов заставляет Zend_Session хранить внутреннее значение, обозначающее это пространство имен сеанса для истечения time() + $seconds
с момента вызова. Каждый раз, когда запускается Zend_Session
, он проверяет, отмечены ли какие-либо данные сеанса для истечения срока действия, и если это продолжается, проверьте, прошло ли время истечения или количество переходов. Если это так, то данные сеанса не задаются при инициализации и поэтому недоступны для вашего приложения.
Если вы выполняете этот вызов в начале каждого запроса, он должен продолжать продлевать срок службы сеанса на столько секунд при каждой загрузке страницы.
Имейте в виду, что если настройки сеанса в php.ini
установлены на истечение сеанса через 15 минут, установка истечения срока действия пространства истечения через 60 минут не приведет к переопределению продолжительности сеанса PHP в течение 15 минут. Вы можете внести такие корректировки в директивы сессии PHP в файле application.ini
.
Установка истечения срока действия в пространстве имен также имеет преимущество автоматического удаления некоторых данных сеанса без необходимости уничтожения всего сеанса.
Я не знаю специфики вашего приложения, но вы можете использовать плагин для проверки и проверки того, что они вышли из системы и перенаправляют запрос на вашу страницу входа. Вы можете проверить действительный логин после создания пространства имен, но вы также захотите убедиться, что текущий запрос не был попыткой входа в систему. Или вы могли бы просто отложить проверку правильности входа в плагин и позволить вашему ACL обрабатывать это позже на уровне контроллера.
Вы также можете просмотреть Zend_Auth, который вы можете использовать для сохранения личности в сеансе. Идентичность может быть любой из простого логического значения, указывающего, если они вошли в систему, к полномасштабному пользовательскому объекту, который реализует Zend_Acl_Role_Interface
. Zend Auth также легко расширяется, поэтому вы можете одновременно активировать несколько сеансов Zend_Auth, используя разные пространства имен для каждого экземпляра и можете иметь собственный пользовательский класс auth, устанавливающий разные временные ограничения для разных пространств имен сеансов.
Надеюсь, что поможет ответить на ваш вопрос, не стесняйтесь комментировать, если у вас есть вопросы о том, что я сказал.
РЕДАКТИРОВАТЬ:
Я проверил следующий код, и он успешно завершил мой идентификатор Zend_Auth после установленного времени. Я тестировал его с 60 секундами, и после ожидания 60 секунд для загрузки страницы я больше не имел и не был идентифицирован и был «выведен». Вы можете добавить это в свой плагин отслеживания сеанса.
<?php $auth = Zend_Auth::getInstance(); if ($auth->hasIdentity()) { // user is logged in // get an instance of Zend_Session_Namespace used by Zend_Auth $authns = new Zend_Session_Namespace($auth->getStorage()->getNamespace()); // set an expiration on the Zend_Auth namespace where identity is held $authns->setExpirationSeconds(60 * 30); // expire auth storage after 30 min }