Intereting Posts
Пользовательская проверка в Laravel 4 file_get_contents Connection Timed Out для некоторого содержимого Переменные переменные, указывающие на массивы или вложенные объекты Как я могу объединиться с PHP и Dot Net Database Могу ли я помещать ассоциативные массивы в формы ввода для обработки на PHP? Загрузка файла CodeIgniter – как сохранить имя файла и путь? DOMDocument в php Как определить два числа, которые ближе друг к другу в массиве Создание представлений в PHP – лучшая практика Как выполнить массовое удаление с использованием Laravel 4.1 на основе массива идентификаторов или объектов? Необходимо проанализировать файл ini для извлечения значений. Как установить сопоставление таблицы с utf_general_ci с помощью doctrine2 Длительный опрос блокирует другие вызовы AJAX Настройка функций PHP на основе таймера Функция php для проверки переменной существует или не находится вне функции

Magento: обнаружение, если администратор зарегистрирован на внешних страницах

Я создал расширение magento. Я хочу реализовать доступ к расширению. Расширение создает страницу в интерфейсе, и я хочу, чтобы только администратор мог получить доступ к этой странице. Поэтому в основном мне нужно что-то, что бы обнаружить, что если администратор зарегистрирован на frontend-страницах.

Я попробовал несколько решений, но, похоже, работает.

if(Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn()) echo 'logged in'; else echo 'not logged in'; 

Проверка интерфейса, если администратор зарегистрирован

 Mage::getSingleton('core/session', array('name'=>'adminhtml')); $adminSession = Mage::getSingleton('admin/session'); $adminSession->start(); if ($adminSession->isLoggedIn()) { echo 'logged in'; } 

Solutions Collecting From Web of "Magento: обнаружение, если администратор зарегистрирован на внешних страницах"

Вышеупомянутые решения не работают!

Вот решение, которое работает (это не так уж и чисто! Но это будет работать в любом месте вашего приложения в представлении или модели phtml или контроллере или помощнике!)

 $sesId = isset($_COOKIE['adminhtml']) ? $_COOKIE['adminhtml'] : false ; $session = false; if($sesId){ $session = Mage::getSingleton('core/resource_session')->read($sesId); } $loggedIn = false; if($session) { if(stristr($session,'Mage_Admin_Model_User')) { $loggedIn = true; } } var_dump($loggedIn);// this will be true if admin logged in and false if not 

есть новый модуль magento, написанный alan storm: https://github.com/astorm/Magento_CrossAreaSessions

 $adminhtml = Mage::getModel('pulsestorm_crossareasession/manager')->getSessionData('adminhtml'); $adminUser = $dataAdminhtml['admin']['user']; $loggedIn = $adminUser->getId() && $adminUser->getIsActive(); 

Если вы пытаетесь заставить его работать в файлах template / phtml и / или внутри класса Block, вам будет сложно. В основном из-за того, что magento (агрессивно) кэширует ваши блоки PHTML для достижения целей, таким образом, отменяя любые инструкции управления потоком программ, у вас есть особенно вещи, связанные с проверкой файлов cookie. У меня нет прямого / длинного / неопределенного объяснения, почему, но это именно то, как я сталкивался с ним снова и снова.

Тем не менее, ваше решение должно быть правильным, но вам нужно сделать проверку в рамках метода допечатной обработки контроллера, например, чтобы избежать вышеупомянутых агрессивных кешей, поскольку контроллеры никогда не кэшируются. (показано в решении Ника в вопросе, который вы связали.):

 // Ensure we're in the admin session namespace for checking the admin user.. Mage::getSingleton('core/session', array('name' => 'adminhtml'))->start(); $admin_logged_in = Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn(); // ..get back to the original. Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace))->start(); 

ЕСЛИ вам действительно нужно выполнить вышеуказанные проверки внутри файлов PHTML или именованных блоков, посмотрите следующий код о том, как отключить кэширование на уровне блоков и, возможно, заставить его работать. То, что я делал ранее, было отключить кеширование для блока нижнего колонтитула (в котором дочерний блок, а не phtml, содержит код для проверки
для определенного файла cookie)

Во-первых, вызов блока (найденный в вашем local.xml или обновлении макета модуля xml или в любом месте, где вы можете делать обновления макета, действительно. Я предпочитаю разбить мои настройки на модули, так что, возможно, обновление макета модуля xml – это путь) :

 <reference name="footer"> <action method="unsetData"><key>cache_lifetime</key></action> <action method="unsetData"><key>cache_tags</key></action> <block type="newsletterpopup/popup" name="newsletterpopup_footer" template="newsletterpopup/popup.phtml"/> </reference> 

И это класс блока newsletterpopup:

 <?php class Launchpad_Newsletterpopup_Block_Popup extends Mage_Core_Block_Template { public function canRender() { // Check if cookie exists here } public function afterRender() { // if block has rendered, this is called. // Set cookie, if it doesn't exist here. } } 

И phtml будет что-то вроде:

 <?php if($this->canRender()): ?> // stuff <?php endif; ?> 

Удачи!

Вот решение, которое работает с Magento 1.7.0.2 (проверено) и на каждом интерфейсе, я использую это в контроллере, не распространяющемся от Mage_Adminhtml_Controller_Action.

https://peters-christoph.de/tutorials/magento-pruefe-admin-session-logi-im-frontend/

Christoph Peters опубликовал ссылку, которая решила мою проблему (детектируйте, если администратор зарегистрирован на frontend-страницах):

 //check if adminhtml cookie is set if(array_key_exists('adminhtml', $_COOKIE)){ //get session path and add dir seperator and content field of cookie as data name with magento "sess_" prefix $sessionFilePath = Mage::getBaseDir('session').DS.'sess_'.$_COOKIE['adminhtml']; //write content of file in var $sessionFile = file_get_contents($sessionFilePath); //save old session $oldSession = $_SESSION; //decode adminhtml session session_decode($sessionFile); //save session data from $_SESSION $adminSessionData = $_SESSION; //set old session back to current session $_SESSION = $oldSession; if(array_key_exists('user', $adminSessionData['admin'])){ //save Mage_Admin_Model_User object in var $adminUserObj = $adminSessionData['admin']['user']; echo 'ADMIN USER IS LOGGED IN'; } else { echo 'ADMIN USER IS NOT LOGGED IN' } } 

Большое спасибо Кристоф Петерс!

Помимо попыток вытащить идентификатор сеанса из adminhtml cookie, который может работать или не работать IMHO, лучше просто «скин-страницу», которую вы должны показать, чтобы выглядеть как в интерфейсе, и использовать контроллер администратора, чтобы он запускался под сеансом администратора.

Другим решением является «копировать» клиента от администратора до внешнего интерфейса и регистрировать его, прежде чем нажимать на свою страницу, а затем просто проверить, является ли зарегистрированный клиент членом какой-либо группы.

Этот код будет работать

 //get the admin session Mage::getSingleton('core/session', array('name'=>'adminhtml')); //verify if the user is logged in to the backend if(Mage::getSingleton('admin/session')->isLoggedIn()) { //do stuff } else { echo "404 page not found"; } 

ИЛИ

 $adminsession = Mage::getSingleton('admin/session', array('name'=>'adminhtml')); if($adminsession->isLoggedIn()) { //do stuff } else { echo "404 page not found"; } 

Вы пытались сбросить переменную $_SESSION ? Возможно, это поможет вам встать на правильный путь.

 require_once $dir.'app/Mage.php'; umask(0); $apps = Mage::app('default'); Mage ::getSingleton('core/session', array('name'=>'adminhtml')); $adminSession = Mage::getSingleton('admin/session'); $adminSession->start(); if ($adminSession->isLoggedIn()) { //echo "logged in"; } else { //echo "Not logged in"; exit(); }?> 

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

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

Ключ, который можно использовать:

 // Ensure we're in the admin session namespace for checking the admin user.. Mage::getSingleton('core/session', array('name' => 'adminhtml'))->start(); $admin_logged_in = Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn(); // ..get back to the original. Mage::getSingleton('core/session', array('name' => $this->_sessionNamespace))->start(); 

заключается в том, что controller должен extends Mage_Adminhtml_Controller_Action

чем вы можете использовать этот код в функции preDispatch .

И настройте routers для этого контроллера в разделе admin вашего config.xml .

Проверьте этот блог , я думаю, вам не нужно проверять с помощью start() перед проверкой с isLoggedIn() .

 Mage::getSingleton('core/session', array('name'=>'adminhtml')); // get sessions $check = Mage::getSingleton('admin/session', array('name'=>'adminhtml')); //get admin sessions if($check->isLoggedIn()) { //check is admin logged in echo "Admin is logged in"; } else { echo "Admin is offline"; }