Intereting Posts
Могу ли я использовать функцию для возврата параметра по умолчанию в php? php – не удается получить доступ к глобальным переменным из Thread? Скребок текстового файла без HTML? Как получить имя файла под папкой? Как получить переменные системной среды в PHP при запуске CLI и Apache2Handler? вставка нескольких строк в базу данных на codeigniter Как автоматически обновить таблицу, когда другая таблица обновляется на другом сервере mysql? Как вернуть массив из функции jQuery ajax success и использовать его в цикле? PHP – использование move_uploaded_file Доступ к нестатической функции класса в PHP PHP Неустранимая ошибка: класс DOMPDF не найден в строке 30 Как преобразовать SimpleXMLObject в PHP-массив? Yii zii.widgets.CDetailView – вывести атрибут как формат HTML-кода Проверка подлинности HTTP с использованием проверки подлинности PHP Могу ли я переписать мои URL-адреса, как это, и это хорошая идея?

Magento – проверка входа администратора и клиента в систему

У меня есть веб-сервер с 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, как проверить, зарегистрирован ли администратор внутри модуля контроллера

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

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

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

 $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); } 

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

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

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

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

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

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

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

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