2012-02-18 2 views
9

Я работаю над приложением, в котором размещается несколько вспомогательных приложений, и я хотел бы реализовать автоматический выход из системы после 30 минут бездействия. У меня есть AuthController с логином и выхода из системы действия, отображенные на пользовательские/логин и/выход из системы маршрутов с использованием Bootstrap.php, а также плагином фронт-контроллера, который выглядит следующим образом:Zend Framework Автоматический выход из системы после неактивности

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 позже.

Edit: Вот мой самозагрузки, если кто-то хочет видеть его:

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

    } 
} 
+0

Сначала определите «неактивность». Все, что мы можем видеть в php, - это запросы сервера. Я действительно ненавижу предлагать это, но вы можете использовать javascript для отслеживания активности, а когда он «выйдет из системы» вызывают метод выхода из системы. Имена пространства имен, похоже, не делают то, что вам нужно. – RockyFord

+0

Неактивность означает, что пользователь не получил POST'd формы, они не попадали в действия контроллера. В основном это «Away from Keyboard». Суб-приложения в этих домах довольно управляются данными, поэтому должно быть очевидно, что они не используют приложение, если вещи не попадают в контроллеры (действия). –

ответ

11

При вызове 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, устанавливающий разные временные ограничения для разных пространств имен сеансов.

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

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 
} 
+0

https://gist.github.com/8b2ae80e23543a34ca8a Есть мое действие для входа. Я использую адаптер Zend_Auth для аутентификации через Active Directory. У меня все работает, за исключением того, что вы можете выйти из системы своего пользователя, если последнее действие, которое они предприняли на сайте, было> 30 минут назад. –

+0

Позже, в вашем приложении, что вы делаете, чтобы проверить, не вошел ли пользователь в систему? Вы просто проверяете, чтобы идентификатор auth не был нулевым? См. Мой обновленный ответ, который показывает, как закончить идентификацию Zend_Auth. Надеюсь, это то, что вы искали. – drew010

+0

Да, если мне нужно посмотреть, если они вошли в систему, я просто забираю getIdentity() и вижу, как он выглядит. Поэтому, когда установка $ authns истекает через 30 минут, это сделает ранее хороший getIdentity() равным нулю? –

Смежные вопросы