Подтвердить что ты не робот

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';
}
4b9b3361

Ответ 1

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

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

Ответ 2

есть новый модуль 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();

Ответ 3

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

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

// 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)

Во-первых, вызов блока (найденный в вашем локальном 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; ?>

Удачи!

Ответ 5

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'
   }
}

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

Ответ 6

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

//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? Возможно, это поможет вам встать на правильный путь.

Ответ 7

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

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

Ответ 8

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();
 }?> 

Ответ 9

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

Спасибо, Kashif

Ответ 10

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

// 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.

Ответ 11

Отметьте этот блог, я думаю, вам не нужно проверять с помощью 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";
    }