Я создал расширение 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'; }
Вышеупомянутые решения не работают!
Вот решение, которое работает (это не так уж и чисто! Но это будет работать в любом месте вашего приложения в представлении или модели 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"; }