24

我创建了一个 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';
}
4

12 回答 12

14

上面的解决方法都不行!

这是一个可行的解决方案(它不是那么干净!但这将在您的应用程序中的 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
于 2013-04-16T10:39:42.130 回答
8

有一个新的 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();
于 2014-10-23T01:26:15.740 回答
7

Christoph Peters 发布了一个链接,解决了我的问题(检测管理员是否登录到前端页面):

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

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

于 2014-09-02T14:13:24.303 回答
3

如果你试图让它在模板/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 的代码)

首先,块调用(在您的 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 的 block 类:

<?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; ?>

祝你好运!

于 2013-04-14T13:37:13.180 回答
3

这是一个适用于 Magento 1.7.0.2(已测试)的解决方案,并且在每个前端站点上,我在未从 Mage_Adminhtml_Controller_Action 扩展的控制器中使用它。

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

于 2013-08-30T19:21:36.363 回答
1

此代码将有效

//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变量?也许它会帮助你走上正轨。

于 2013-04-17T09:50:26.457 回答
1

这很简单,但不是推荐的解决方案。我自己花了几个小时来做​​这件事。对于基于 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";

谢谢, 卡希夫

于 2014-02-03T11:45:41.097 回答
1

除了尝试从 adminhtml cookie 中提取会话 id 之外,这可能会或可能不会起作用恕我直言,最好只是“皮肤”页面,您需要在前端显示它看起来像它并使用管理控制器,以便它将在管理会话下运行。

另一种解决方案是将客户从管理员“复制”到前端并在点击您的页面之前将其登录,然后只需检查登录的客户是否是某个组的成员。

于 2013-04-18T14:06:16.473 回答
0
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();
 }?> 
于 2013-11-03T21:29:33.220 回答
0

能够使用的关键:

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

于 2013-04-14T17:28:27.820 回答
-1

检查这个博客,我认为你不需要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";
    }
于 2013-04-05T10:16:58.557 回答
-1

如果您使用 cm redis session 试试这个:(为我工作)

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

因为如果您使用 cm redis,它会使用自己的模型重写 db session 模块。

于 2018-02-05T14:45:30.650 回答