2011-11-18 52 views
1

我對Zend Auth有所擔憂。我在互聯網上搜索過,但沒有找到任何教程,文章或討論;Zend AUTH在差異計算機或瀏覽器上禁用多次登錄

方案:同時在'COMPUTER 01'和'COMPUTER 02'上以'ADMIN'登錄。

我想讓我的用戶登錄系統阻止'ADMIN'用戶同時登錄兩臺計算機。因此,當用戶已經登錄時,系統將禁用其他機器上的登錄。

+0

您在此網站上提出了四個問題,但尚未接受答案。如果你想讓這裏的人來幫助你,也許你會想要解決這個問題。 – vascowhite

回答

3

據我所知,這個功能不是內置於Zend_Auth,但你可以達到你想要什麼由你正在使用擴展Zend_Auth_Adapter和overiding的authenticate()方法danielrsmith建議。

您需要向登錄過程中設置/取消設置的數據庫添加一個表。如果用戶沒有特別註銷,問題將會被解除,但是您可以在數據庫中存儲時間戳,並允許登錄到下一次登錄嘗試。

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

試試這個:

  1. 在數據庫中創建會話表:

    CREATE TABLE sessionid CHAR(32), modified INT, lifetime INT, data文本, PRIMARY KEY (id) );

  2. 通過Zend_Session_SaveHandler_DbTable在數據庫中存儲會話。把下面的代碼在bootstrap.php中

    protected function _initDoctrineSession() 
    

    {$ URL =常數( 「APPLICATION_PATH」)。DIRECTORY_SEPARATOR。 「CONFIGS」 .DIRECTORY_SEPARATOR。「應用程序。INI 「; $配置=新Zend_Config_Ini的($網址,」 MySQL的「); $ DB = 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. 當日志,保存用戶ID或用戶名在會話:

    $logged_user = new Zend_Session_Namespace('logged_user'); 
    $logged_user->logged_user = $user->name; 
    
  4. 另一個日誌中刪除所有過期會話數據庫首先:

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

畫完登錄,搜索會話表記錄,看看是否當前用戶已經登錄:

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

這將工作。但是有一個問題,如果用戶在註銷之前關閉Web瀏覽器,用戶將無法在會話過期之前再次登錄。任何人都可以幫助解決最後一個問題?