Magento - проверка входа администратора и клиента - PullRequest
7 голосов
/ 09 февраля 2011

У меня есть веб-сервер с установленным Magento 1.4.0.1.У меня есть другой веб-сайт, который делится с ним учетными данными.Мне удалось проверить, вошел ли клиент в систему или нет (после изменения расположения файлов cookie в Magento), но все усложнилось, когда я также попытался выяснить, вошел ли администратор. Я могу получить только правильный ответ.для первого сеанса, который я просил (либо клиент, либо администратор, второй никогда не вошел в систему).

Как я могу получить оба ответа?

Вот код, который я использую для проверки этого:


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";
}

Итак, с таким кодом администратор никогда не будет авторизован. Если вы добавите часть об администраторево-первых, затем клиент никогда не входит в систему. Кажется, что я пропускаю грань между двумя запросами.

Это может быть та же проблема, что и этот вопрос без ответа: Magento, как проверить, если администраторзарегистрирован в контроллере модуля

Это кажется популярной проблемой, но я не смог найти правильное решение ...

Спасибо за вашу помощь!

Ответы [ 5 ]

4 голосов
/ 16 марта 2011

Я обнаружил эту «особенность ошибки» под другим углом зрения (пытаясь войти в систему клиента со стороны администратора), но все же нашел причину.

Проблема в функции session_name ().Если вы перейдете к Mage_Core_Model_Session_Abstract_Varien, то увидите, что объект сеанса использует стандартные функции сеанса PHP, и PHP не может обрабатывать два сеанса одновременно.

Ваш идентификатор сеанса для adminside хранится в cookie adminhtml, а для клиентского идентификатора вашего сеанса - в cookie внешнего интерфейса.Затем в админсайде у вас есть идентификатор сессии, инициализированный файлом cookie adminhtml.Находясь в административной части, ваш объект customer / session хранится внутри чего-то вроде $ _SESSION ['customer'] (не проверил точный ключ) внутри сессии PHP для идентификатора, хранящегося в cookie adminhtml.Это означает, что объект клиент / сеанс ссылается на разные сеансы внутри администраторской и клиентской частей magento.

2 голосов
/ 16 января 2013

Что вам нужно сделать, это переключить данные сеанса.Вы можете сделать это с помощью следующего кода:

$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);
}
0 голосов
/ 03 февраля 2014

Это довольно простое, но не рекомендуемое решение.Я сам провожу несколько часов, чтобы сделать это.Для сервера на базе 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";

Спасибо, Кашиф

0 голосов
/ 08 марта 2013

Вот простой скрипт, чтобы проверить, зарегистрирован администратор или нет, и, если он зарегистрирован, получите данные администратора 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/ для более подробной информации.

0 голосов
/ 09 февраля 2011

Вот что я использую ..

Mage::getSingleton('core/session', array('name'=>'adminhtml'));
$session = Mage::getSingleton('admin/session');;
if (!$session->getUser())
{
    die("You aren't an admin!"); 
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...