2012-04-23 2 views
0

Я использую Zend_Auth для purposes.Code аутентификации для того же выглядит следующим образом:Как установить тайм-аут при использовании Zend_Auth в рамках Zend

   $authAdapter = $this->getAuthAdapter(); 
      $authAdapter->setIdentity($username) 
        ->setCredential($password); 
      $auth = Zend_Auth::getInstance(); 
      $result = $auth->authenticate($authAdapter); 
      # is the user a valid one? 
      if ($result->isValid()) { 
       # all info about this user from the login table 
       # ommit only the password, we don't need that 
       $userInfo = $authAdapter->getResultRowObject(null, 'password'); 

       # the default storage is a session with namespace Zend_Auth 
       $authStorage = $auth->getStorage(); 
       $authStorage->write($userInfo); 
       $emp_id = $userInfo->employee_id; 
       $userInfo = Zend_Auth::getInstance()->getStorage()->read(); 
       $array_db = new Application_Model_SetMstDb(); 
       $array_name = $array_db->getName($emp_id); 

       foreach ($array_name as $name) : 
        $fname = $name['first_name']; 
        $lname = $name['last_name']; 
       endforeach; 

       $firstname = new stdClass; 
       $lastname = new stdClass; 
       $userInfo->firstname = $fname; 
       $userInfo->lastname = $lname; 

       $privilege_id = $userInfo->privilege_id; 
       echo 'privilege in Login: ' . $privilege_id; 
       $this->_redirect('index/index'); 
      } else { 
       $errorMessage = "Invalid username or password"; 
       $this->view->error = $errorMessage; 
       } 

где getAuthAdapter() следующим образом:

 protected function getAuthAdapter() { 
    $dbAdapter = Zend_Db_Table::getDefaultAdapter(); 
    $authAdapter = new Zend_Auth_Adapter_DbTable($dbAdapter); 

    $authAdapter->setTableName('credentials') 
      ->setIdentityColumn('employee_id') 
      ->setCredentialColumn('password'); 


    return $authAdapter; 
} 

Я хочу установить тайм-аут сеанса. Я хочу установить тайм-аут 5 минут и когда пользователь не будет активен в течение 5 минут, тогда должен быть истек срок действия, который должен вызывать действие выхода из системы, код которого выглядит следующим образом:

 public function logoutAction() { 
    // action body 
    Zend_Auth::getInstance()->clearIdentity(); 
    $this->_redirect('login/index'); 
    } 

Заранее спасибо.Plz Помогите мне. Это срочно.

Когда я использую

$session = new Zend_Session_Namespace('Zend_Auth'); 
    $session->setExpirationSeconds(60); 

управления перенаправляет на страницу входа в систему автоматически через 60 секунд, но я хочу, что если пользователь приложения в неактивны в течение 60 секунд, а затем только он redirects.At присутствует ли активный пользователь или не происходит перенаправление.

+0

здесь: http://stackoverflow.com/questions/5146217/get-session-expiration-time-in-zend-framework – bmartins

+0

Если я буду использовать $ session = новое Zend_Session_Namespace ('Zend_Auth'); $ session-> setExpirationSeconds (60); то как проверить, что 60 секунд завершено, и где он должен быть проверен, как это должно быть проверено в методе init() для каждого контроллера. – ryan

+0

Пожалуйста, дайте фрагмент кода – ryan

ответ

0

Я бы не использовал init() для этого. init() следует использовать для установки состояния объекта.

Я бы использовал preDispatch(). Но чтобы избежать использования всех контроллеров или создания базового контроллера, а затем расширения. Вы можете сделать плагин и добавить его в Bootstrap.

class YourControllerPlugin extends Zend_Controller_Plugin_Abstract { 
    public function preDispatch() { 
     //check if expired 
     if(hasExpired()) { 
      //logout and redirect 
     } 
    } 
} 

, чтобы добавить его на Bootstrap:

public function __initYourPlugin() { 
    $this->bootstrap('frontController'); 

    $plugin = new YourControllerPlugin(); 

    $front = Zend_Controller_Front::getInstance(); 
    $front->registerPlugin($plugin); 

    return $plugin; 
} 
+0

Здесь $ this-> bootstrap ('frontController'); должен использоваться как есть, или я должен указать свой фронт-контроллер, который является loginController ?? – ryan

+0

Не ваш LoginController. Просто убедитесь, что мы инициализируем фронт-контроллер Zend, который отвечает за среду запроса. Какая версия используемой структуры? – bmartins

+0

Я использую Zend framework 1.11.11 – ryan

0

Я смотрю на мой код для этого прямо сейчас. Этот фрагмент из плагина переднего контроллера. Каждый раз, когда пользователь, прошедший проверку подлинности, запрашивает страницу, я возвращаю свое завершение сеанса, чтобы у них было 60 минут, поскольку они были последними «активными».

public function dispatchLoopStartup(Zend_Controller_Request_Abstract $request) { 

    //check whether the client is authenticated 
    if (Zend_Auth::getInstance()->hasIdentity()) { 

     $session = $this->_getAuthSession(); 

     //update session expiry date to 60mins from NOW 
     $session->setExpirationSeconds(60*60); 

     return; 
    } 

В сторону: Я ищу на этот код способ, чтобы показать пользователю сообщение «сеанса истекло», а не текущий «вы не прошла проверку подлинности» сообщение.

+0

Я думаю, что изначально я нашел ответ здесь http://stackoverflow.com/questions/9344577/zend-framework-automatic-logout-after-inactivity –