Zend AUTH отключить множественный вход в систему на компьютере или браузере - PullRequest
1 голос
/ 18 ноября 2011

Меня беспокоит Zend Auth.Я искал по всему интернету, но не нашел ни одного учебника, статьи или обсуждения; сценарий

: войдите как «ADMIN» в «COMPUTER 01» и «COMPUTER 02» одновременно.

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

Ответы [ 3 ]

4 голосов
/ 19 ноября 2011

Насколько мне известно, эта функциональность не встроена в Zend_Auth, но вы можете достичь того, чего хотите, расширив Zend_Auth_Adapter, который вы используете в настоящее время, и перевесив authenticate() метод, как предполагает Даниэльсмит.

Вам необходимо добавить таблицу в вашу БД, которая устанавливается / не устанавливается в процессе входа в систему.Проблема будет неустановленной, если пользователь специально не выйдет из системы, но вы можете сохранить временную метку в БД и разрешить истечь время входа для следующей попытки входа в систему.

My_Auth_Adapter_DbTable extends Zend_Auth_Adapter_DbTable
{
    public function authenticate()
    {
        $authResult = parent::authenticate();
        if($this->alreadyLoggedIn(){
            $authResult = new Zend_Auth_Result(
                Zend_Auth_Result::FAILURE_UNCATEGORIZED,
                $this->_identity,
                array('User already logged in')
            );
        } else {
            $this->setLoggedIn();
        }
        return $authResult;
    }

    private function alreadyLoggedIn()
    {
        //check db table to see if $this->_identity is already logged in
        //then return true or false as appropriate
    }
    private function setLoggedIn()
    {
        //update table in DB to reflect logged in status
    }
}

У меня нетЯ проверил этот код, но, надеюсь, он поможет вам в правильном направлении.Кроме того, я думаю, что если вы сделаете это таким образом, то вам не нужно будет каким-либо образом изменять обработчик сессии.

1 голос
/ 21 июля 2015

Попробуйте это:

  1. Создать таблицу сеансов в базе данных:

    CREATE TABLE session ( id char (32), modified int, lifetime int, data текст, ПЕРВИЧНЫЙ КЛЮЧ (id) )

  2. Хранить сеанс в базе данных по Zend_Session_SaveHandler_DbTable. Поместите следующий код в bootstrap.php

    protected function _initDoctrineSession()
    

    { $ url = constant ("APPLICATION_PATH"). DIRECTORY_SEPARATOR. "configs" .DIRECTORY_SEPARATOR. "application.ini"; $ config = new Zend_Config_Ini ($ url, "mysql"); $ Дб = Zend_Db :: завод ($ config-> дб);

    Zend_Db_Table_Abstract::setDefaultAdapter($db);
    $config = array(
    'name'           => 'session',
    'primary'        => 'id',
    'modifiedColumn' => 'modified',
    'dataColumn'     => 'data',
    'lifetimeColumn' => 'lifetime'
    );
    
    Zend_Session::setSaveHandler(new Zend_Session_SaveHandler_DbTable($config));
    Zend_Session::start();      
    

    }

  3. При входе в систему сохраните идентификатор пользователя или имя пользователя в сеансе:

    $logged_user = new Zend_Session_Namespace('logged_user');
    $logged_user->logged_user = $user->name;
    
  4. Другой вход в систему сначала удаляет все просроченные сеансы в базе данных:

    $sessionModel = new Session();
    $sessionModel->removeExpiredSessions();
    

5.После входа в систему выполните поиск записей таблицы сеансов, чтобы определить, вошел ли текущий пользователь в систему:

$sessions = $sessionModel->querySessions();
        $flag=true;
        foreach ($sessions as $session){
            if(strpos($session['data'], $user->name)>0 and strpos($session['data'],"Zend_Auth")>0
            ){
                $flag=false;
            }
        }
        if($flag == false){
            $this->_forward('index','index');
            return;
        }

Это будет работать. Но есть проблема: если пользователь закроет веб-браузер перед выходом из системы, он не сможет снова войти в систему до истечения сеанса. Кто-нибудь может помочь решить последнюю проблему?

0 голосов
/ 19 ноября 2011

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

http://framework.zend.com/manual/en/zend.session.savehandler.dbtable.html

Оттуда вы захотите написать собственный адаптер Zend_Auth, который проверяеттаблица сеансов для активных входов в систему для этой учетной записи и возврата false, если активный вход уже существует.

http://framework.zend.com/manual/en/zend.auth.introduction.html

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...