我是php新手,我正在尝试使用_SESSION ['SESSION_DATA'] = $ sessionData存储会话数据(我在我的应用程序中创建)对象。当用户登录我的应用程序时,我尝试从会话中检索会话数据对象,如果对象已初始化,那么我假设用户已经登录并使用会话中的数据。如果未设置该对象,我们确定用户正在登录并尝试创建会话数据对象并将其放入会话中。
当我使用第一个用户ID登录时,应用程序运行正常。但是当我同时使用不同的用户ID登录时,在我的登录操作中,我看到会话数据对象是从属于第一个用户的会话中检索的。
有人可以建议如何处理这个问题。我们正在使用zend Framework。是否有任何内容可以隐含地处理这种情况。
答案 0 :(得分:1)
我认为你的意思是在同一台计算机上使用相同的浏览器登录另一个用户而另一个用户已登录?如果是这样,我不认为你可以将它分开,因为session是一个浏览器会话。
答案 1 :(得分: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
使用Doctrine \ ORM \ EntityManager; class Altergear_MyApp_UserLoginAuthAdapter实现Zend_Auth_Adapter_Interface { / ** *登录 * @var string $ _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插件来管理对控制器和操作的访问。