Magento - 检查管理员和客户是否已登录

时间:2011-02-09 20:27:25

标签: php session magento

我安装了Magento 1.4.0.1的Web服务器。我有另一个网站与它共享凭证。我已经设法检查客户是否已登录(在更改了Magento中的cookie位置之后),但是当我还试图弄清楚管理员是否已登录时,事情变得复杂。我只能得到正确的答案对于我要求的第一个会话(客户或管理员,第二个是永远不会登录)。

我怎样才能得到这两个答案?

以下是我用来测试的代码:


require_once '../app/Mage.php';
umask(0) ;

Mage::app();

// Checking for customer session
Mage::getSingleton('core/session', array('name'=>'frontend') );
$session=Mage::getSingleton('customer/session', array('name'=>'frontend') );

if ($session->isLoggedIn()) {
    echo "Customer is logged in";
} else {
    echo "Customer is not logged in";
}

// Checking for admin session
Mage::getSingleton('core/session', array('name'=>'adminhtml') ); 
$adminsession = Mage::getSingleton('admin/session', array('name'=>'adminhtml'));

if($adminsession->isLoggedIn()) {
    echo "Admin Logged in";
} else {
    echo "Admin NOT logged in";
}

因此,使用这样的代码,管理员永远不会登录。如果您先将部分放在管理员的位置,那么客户永远不会登录。看起来我在两个请求之间缺少一条线。 / p>

这可能与这个未回答的问题相同:Magento how to check if admin is logged in within a module controller

这似乎是一个受欢迎的问题,但我找不到合适的解决方案......

感谢您的帮助!

5 个答案:

答案 0 :(得分:4)

我从另一个角度发现了“bug-feature”(尝试从adminside登录客户),但仍然找到了原因。

问题在于session_name()函数。如果你去Mage_Core_Model_Session_Abstract_Varien,你会发现会话对象正在使用标准的PHP会话函数,PHP无法同时处理两个会话。

adminside的会话ID存储在cookie adminhtml中,而对于客户端,您的会话ID位于前端cookie中。然后在adminside中,您将通过adminhtml cookie初始化会话ID。在adminside中,您的客户/会话对象存储在PHP会话内的$ _SESSION ['customer'](未检查确切密钥)内,以存储在adminhtml cookie中的ID。这意味着客户/会话对象在内部管理员和magento的客户端部分时引用不同的会话。

答案 1 :(得分:2)

您需要做的是切换会话数据。您可以使用以下代码执行此操作:

$switchSessionName = 'adminhtml';
$currentSessionId = Mage::getSingleton('core/session')->getSessionId();
$currentSessionName = Mage::getSingleton('core/session')->getSessionName();
if ($currentSessionId && $currentSessionName && isset($_COOKIE[$currentSessionName])) {
    $switchSessionId = $_COOKIE[$switchSessionName];
    $this->_switchSession($switchSessionName, $switchSessionId);
    $whateverData = Mage::getModel('mymodule/session')->getWhateverData();
    $this->_switchSession($currentSessionName, $currentSessionId);
}

protected function _switchSession($namespace, $id = null) {
    session_write_close();
    $GLOBALS['_SESSION'] = null;
    $session = Mage::getSingleton('core/session');
    if ($id) {
        $session->setSessionId($id);
    }
    $session->start($namespace);
}

答案 2 :(得分:0)

这是我使用的..

Mage::getSingleton('core/session', array('name'=>'adminhtml'));
$session = Mage::getSingleton('admin/session');;
if (!$session->getUser())
{
    die("You aren't an admin!"); 
}

答案 3 :(得分:0)

这很简单,但不是推荐的解决方案。我自己花了很多时间来做这件事。 对于,基于Windows的服务器尝试以下解决方案:

$sessionFilePath = Mage::getBaseDir('session').DS.'sess_'.$_COOKIE['adminhtml'];
$sessionFile     = file_get_contents($sessionFilePath); 
$exp_cookie   = explode(';',$sessionFile);
if(count($exp_cookie)   >   100)
{
  return "login";
}
return "expire";    

对于,基于Linux的服务器尝试以下解决方案:

$sessionFilePath = Mage::getBaseDir('session').DS.'sess_'.$_COOKIE['adminhtml'];
$sessionFile     = file_get_contents($sessionFilePath); 
$exp_cookie   = explode('--',$sessionFile)
if(count($exp_cookie)   >   10)
{
  return "login";
}
return "expire";

谢谢, 卡希夫

答案 4 :(得分:-2)

这是一个简单的脚本,用于检查管理员是否已记录,如果已记录,则获取Magento的管理员详细信息。您可以调用会话和调用用户函数以获取所有详细信息。

$userDetails = Mage::getSingleton('admin/session');    // Get data from the session
$userID      = $userDetails->getUser()->getUserId();   // Get user ID
$userID      = $userDetails->getUser()->getEmail();   // Get user Email

有关详细信息,请参阅http://webexplorar.com/magento-admin-details/