2011-11-05 106 views
0

我是新來的PHP,我試圖用_SESSION ['SESSION_DATA'] = $ sessionData存儲會話數據(我在應用程序中創建的)對象。當用戶登錄到我的應用程序時,我嘗試從會話中檢索會話數據對象,如果對象已初始化,那麼我假定用戶已經登錄並使用會話中的數據。如果對象未設置,我們確定用戶正在登錄並嘗試創建會話數據對象並將其放入會話中。PHP會話與不同用戶共享

當我用第一個用戶ID登錄時,應用程序工作正常。但是,當我同時使用不同的用戶標識登錄時,在我的登錄操作中,我看到會話數據對象是從屬於第一個用戶的會話中檢索的。

有人可以建議如何處理這個問題。我們正在使用zend框架。隱式地處理這種情況是否有任何zend?

+1

你的會議不關心誰試圖登錄。它附在瀏覽器的會話中。因此,只要一個用戶註銷並嘗試在同一個瀏覽器會話中再次登錄,您就必須小心刪除它。 – janoliver

回答

1

我假設你的意思是與其他用戶在同一臺​​計算機上使用相同的瀏覽器登錄,而另一個用戶已經登錄?如果是這樣,我不認爲你可以分開它,因爲會話是瀏覽器會話。

+0

我沒有使用相同的瀏覽器,而是打開一個新的瀏覽器/窗口並使用其他用戶標識登錄。這是在同一臺機器上完成的,保持第一個用戶瀏覽器處於活動狀態。我正在使用谷歌瀏覽器。 – Sanjeev

+1

使用兩種不同的瀏覽器。 Chrome共享(如大多數瀏覽器)所有窗口/標籤中的Cookie。 – Geert

0

您應該使用Zend_Auth進行身份驗證。 更多關於它,你可以在這裏閱讀:manual.zfdes.com/de/zend.auth.html

這是我如何使用Zend_Auth的:

 $auth = Zend_Auth::getInstance(); 
     $authAdapter = new Altergear_Seolista_UserLoginAuthAdapter(
      $loginForm->getLogin(), 
      $loginForm->getPassword() 
     ); 

     $result = $auth->authenticate($authAdapter); 

認證適配器返回一個新的組成Zend_Auth_Result用新身份。對於那些我使用stdClass對象。它將取代舊的身份。

這裏是我的適配器作爲一個例子

<?php 

使用原則\ ORM \ EntityManager的; 類Altergear_MyApp_UserLoginAuthAdapter實現了Zend_Auth_Adapter_Interface { /** * 登錄 * @var串$ _login */ 私人$ _login;

/** 
* The user password 
* @var string $_password 
*/ 
private $_password; 

/** 
* The Doctrine EntityManager 
* @var EntityManager $_em 
*/ 
private $_em; 
public function __construct($email, $password) 
{ 
    $registry = Zend_Registry::getInstance(); 
    $this->_em = $registry->entitymanager; 

    $this->_login = $email; 
    $this->_password = $password; 
} 

/** 
* Executes an authentication try 
* 
* @throws Zend_Auth_Adapter_Exception if the authentication failed 
* @return Zend_Auth_Result 
*/ 
public function authenticate() 
{ 
     //check if login is correct 
     try{ 
      $user = $this->_em->getRepository('App_Model_User') 
       ->findOneBy(
        array(
         '_email' => $this->_login, 
         '_password' => App_Model_User::encodePassword($this->_password) 
        ) 
      ); 
     }catch(Exception $e){ 
      throw new Zend_Auth_Adapter_Exception('authentication failed', 0, $e);    
     } 

     if($user!==null && $user instanceof App_Model_User && $user->getId() > 0) 
     { 
      //login successful 

      $identity = new stdClass(); 
      $identity->user = $user; 


      return new Zend_Auth_Result(Zend_Auth_Result::SUCCESS , $identity); 
     }else{ 
      //login failed 
      return new Zend_Auth_Result(Zend_Auth_Result::FAILURE, NULL, array('Bitte geben Sie gültige Logindaten an.')); 
     } 

在頂部,你可以用Zend_Acl裏工作,我建議你Zend_Controller的插件管理訪問您的控制器和動作。