Zend Framework Автоматический выход из строя после неактивности - PullRequest
9 голосов
/ 19 февраля 2012

Я работаю над приложением, в котором размещено несколько вспомогательных приложений, и я хотел бы реализовать автоматический выход из системы после 30 минут бездействия. У меня есть AuthController с действиями входа и выхода, сопоставленными с пользовательскими маршрутами / login и / logout, используя 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());

    }
}

1 Ответ

11 голосов
/ 19 февраля 2012

Когда вы звоните 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, используя разные пространства имен для каждого экземпляра, и ваш собственный класс аутентификации может устанавливать разные ограничения по времени для разных пространств имен сеанса.

Надеюсь, это поможет ответить на ваш вопрос, не стесняйтесь комментировать, если у вас есть вопросы по поводу того, что я сказал.

EDIT:

Я протестировал следующий код, и он успешно истек мой идентификатор 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...