2011-11-05 7 views
0

저는 PHP에 익숙하지 않고 _SESSION [ 'SESSION_DATA'] = $ sessionData를 사용하여 세션 데이터 (내 애플리케이션에서 생성 한)를 저장하려고합니다. 사용자가 내 응용 프로그램에 로그인하면 세션에서 세션 데이터 개체를 가져 오려고 시도합니다. 개체가 초기화되면 사용자가 이미 로그인하여 세션의 데이터를 사용한다고 가정합니다. 개체가 설정되지 않은 경우 사용자가 로그인하고 세션 데이터 개체를 만들어 세션에 넣으려고합니다.PHP 세션이 다른 사용자와 공유되었습니다.

첫 번째 사용자 ID로 로그인하면 응용 프로그램이 정상적으로 작동합니다. 하지만 동시에 다른 사용자 ID로 로그인 할 때 로그인 액션에서 세션 데이터 객체가 첫 번째 사용자에게 속한 세션에서 검색되는 것을 볼 수 있습니다.

누군가이 문제를 처리하는 방법에 대해 조언 해 줄 수 있습니까? 우리는 zend Framework를 사용하고 있습니다. 이 경우 암시 적으로 처리 할 항목이 zend에 있습니까?

+1

세션에서 누가 로그인을 시도하든 상관하지 않습니다. 브라우저의 세션에 첨부됩니다. 따라서 한 명의 사용자가 로그 아웃하고 같은 브라우저 세션에서 다시 로그인하려고하자마자 삭제하는 데주의해야합니다. – janoliver

답변

1

다른 사용자가 이미 로그인 한 상태에서 같은 컴퓨터에서 같은 브라우저를 사용하고있는 다른 사용자와 로그인을 의미합니까? 그렇다면 세션을 브라우저 세션으로 분리 할 수 ​​있다고 생각하지 않습니다.

+0

동일한 브라우저를 사용하지 않고 새 브라우저/창을 열고 다른 사용자 ID로 로그인하고 있습니다. 이 작업은 동일한 시스템에서 수행되어 첫 번째 사용자 브라우저가 활성 상태로 유지됩니다. Google 크롬 브라우저를 사용하고 있습니다. – Sanjeev

+1

두 가지 브라우저를 사용하십시오. 모든 Windows/탭에서 Chrome은 (대부분의 브라우저와 마찬가지로) 쿠키를 공유합니다. – 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); 

Authentication (인증) 어댑터는 새와 함께 새로운 Zend_Auth_Result을 반환 정체. 그 사람들을 위해 나는 stdClass 객체를 사용한다. 이전 ID를 대체합니다. 여기

예로 들어 내 어댑터입니다

<?php 

사용 교리 \ ORM \ EntityManager의; 클래스 Altergear_MyApp_UserLoginAuthAdapter이 Zend_Auth_Adapter_Interface 구현 { /** * 로그인 * @var 문자열 $ _login */ 개인 $의 _login; 당신이 Zend_Acl로 작업 할 수 있습니다 상단에

/** 
* 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_Controller 플러그인을 추천합니다.