Magento的:检测如果管理员在前端页面登录(Magento: Detect if admin i

2019-08-19 18:08发布

我创建了一个Magento的扩展。 我想要实现访问扩展。 扩展创造了前端页面,我想只有管理员才能访问该页面。 所以基本上我需要的东西,会发现,如果管理员在前端页面登录。

我已经尝试了几种解决方案,但指出似乎工作。

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

Answer 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


Answer 2:

有一个新的Magento的模块,由阿兰风暴写着: https://github.com/astorm/Magento_CrossAreaSessions

$adminhtml  = Mage::getModel('pulsestorm_crossareasession/manager')->getSessionData('adminhtml');

$adminUser = $dataAdminhtml['admin']['user'];
$loggedIn = $adminUser->getId() && $adminUser->getIsActive();


Answer 3:

克里斯托夫·彼得斯公布其解决我的问题(检测是否管理员在前端页面登录)链接:

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

非常感谢您克里斯托夫·彼得斯!



Answer 4:

如果你想使模板/ PHTML文件内工作,和/或块的类中你将有一个困难时期。 主要是因为Magento的(积极)缓存您的PHTML块提高性能的目的。因此,请撤消所有程序流程控制语句,你有特别的东西用饼干检查有关。 我没有直接/悠悠/深入解释为什么,但是这只是我已经一遍又一遍遇到过。

然而,你的解决方案应该是正确的,但你需要做一个控制器的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)

首先,块调用(在你的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; ?>

祝好运!



Answer 5:

这里是一个解决方案工作原理与Magento的1.7.0.2(测试)和在每个站点前端,我使用这在控制器未从Mage_Adminhtml_Controller_Action延伸。

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



Answer 6:

除了试图从adminhtml cookie,它可能会或可能无法正常工作恕我直言,是更好地拉会话ID只是“皮肤”页面,你需要展示看起来像它在前端和使用管理控制器,因此它会管理会话下运行。

另一种解决方案是从管理员“复制”客户前端和打你的页面,那么它此事只是检查如果登录用户的登录之前他们是一些组的成员。



Answer 7:

此代码将作品

//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变量? 也许这将帮助你在正确的轨道上。



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


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

谢谢,卡希夫



Answer 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



Answer 11:

如果您使用的Redis厘米届试试这个:(为我工作)

$sesId = isset($_COOKIE['adminhtml']) ? $_COOKIE['adminhtml'] : false ;
if($sesId){
    $session = Mage::getSingleton('core_mysql4/session')->read($sesId);
}
$loggedIn = false;
if($session)
{
    if(stristr($session,'Mage_Admin_Model_User'))
    {
        $loggedIn = true;
    }
}

var_dump($loggedIn);

因为如果你使用Redis的厘米其重写DB与自己的模式会话模块。



Answer 12:

检查这个博客 ,我觉得你不必与检查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";
    }


文章来源: Magento: Detect if admin is logged in in frontend pages