【问题标题】:PHP session is shared with different usersPHP 会话与不同的用户共享
【发布时间】:2011-11-05 20:31:07
【问题描述】:

我是 php 新手,我正在尝试使用 _SESSION['SESSION_DATA'] = $sessionData.当用户登录到我的应用程序时,我尝试从会话中检索会话数据对象,如果对象已初始化,那么我假设用户已经登录并使用会话中的数据。如果没有设置对象,我们判断用户正在登录,并尝试创建会话数据对象并将其放入会话中。

当我使用第一个用户 ID 登录时,应用程序运行正常。但是,当我同时使用不同的用户 ID 登录时,在我的登录操作中,我看到会话数据对象是从属于第一个用户的会话中检索到的。

有人可以建议如何处理这个问题。我们正在使用 zend 框架。 Zend 中有什么可以隐式处理这种情况的。

【问题讨论】:

  • 您的会话不关心谁尝试登录。它附加到浏览器的会话。因此,当一个用户退出并尝试在同一浏览器会话中再次登录时,您必须小心删除它。

标签: php session


【解决方案1】:

我假设您的意思是在同一台计算机上使用同一浏览器与另一个用户登录,而另一个用户已经登录?如果是这样,我认为您不能将其分开,因为会话是浏览器会话。

【讨论】:

  • 我没有使用相同的浏览器,而是打开一个新的浏览器/窗口并使用不同的用户 ID 登录。这是在保持第一个用户浏览器处于活动状态的同一台机器上完成的。我正在使用谷歌浏览器。
  • 使用两种不同的浏览器。 Chrome 在所有窗口/标签之间共享(与大多数浏览器一样)cookie。
【解决方案2】:

您应该使用 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; 类 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 插件来管理对您的控制器和操作的访问。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-19
    • 2016-02-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-28
    • 2011-02-28
    • 2014-01-24
    相关资源
    最近更新 更多