Как установить тайм-аут при использовании Zend_auth в Zend framework

Я использую Zend_auth для целей аутентификации. Код для этого выглядит следующим образом:

             $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');
   }

Заранее спасибо. Пожалуйста, помогите мне. Это срочно.

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

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

управление автоматически перенаправляет на страницу входа через 60 секунд, но я хочу, чтобы, если пользователь приложения неактивен в течение 60 секунд, тогда только он перенаправляется. В настоящее время происходит перенаправление, независимо от того, активен пользователь или нет.


person ryan    schedule 23.04.2012    source источник
comment
здесь: stackoverflow.com/questions /5146217/   -  person ehanoc    schedule 23.04.2012
comment
Если я буду использовать $session = new Zend_Session_Namespace('Zend_Auth'); $session-›setExpirationSeconds(60); затем, как проверить, что 60 секунд были завершены и где это нужно проверить, как это должно быть проверено в методе init() каждого контроллера.   -  person ryan    schedule 23.04.2012
comment
Пожалуйста, дайте фрагмент кода   -  person ryan    schedule 23.04.2012


Ответы (2)


Я бы не использовал 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;
}
person ehanoc    schedule 23.04.2012
comment
Здесь $this-›bootstrap('frontController'); должен использоваться как есть, или я должен указать свой передний контроллер, который называется loginController?? - person ryan; 23.04.2012
comment
Не ваш LoginController. Это просто для того, чтобы убедиться, что мы инициализируем передний контроллер Zend, который отвечает за среду запросов. Какую версию фреймворка вы используете? - person ehanoc; 23.04.2012
comment
Привет, я вас не понимаю. Пожалуйста, ответьте на следующий вопрос: 1. Где я должен определить сеанс и время его истечения?? 2. Должен ли он быть определен в файле начальной загрузки? 3. Приведенные выше два фрагмента должны быть указаны в файле начальной загрузки. ?? - person ryan; 24.04.2012

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

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

person James Newell    schedule 19.06.2012
comment
Я думаю, что первоначально нашел ответ здесь stackoverflow. com/questions/9344577/ - person James Newell; 20.06.2012