我创建了一个magento扩展。我想实现对扩展的访问。该扩展程序在前端创建一个页面,我只希望管理员访问该页面。所以基本上我需要能够检测到管理员是否在前端页面登录的东西。
我尝试了几种解决方案,但注意似乎有用。
if(Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn()) echo 'logged in'; else echo 'not logged in';
Check on frontend if admin is logged in
Mage::getSingleton('core/session', array('name'=>'adminhtml'));
$adminSession = Mage::getSingleton('admin/session');
$adminSession->start();
if ($adminSession->isLoggedIn()) {
echo 'logged in';
}
答案 0 :(得分:13)
上述解决方案不起作用!
这是一个有效的解决方案(它不是那么干净!但是这可以在你的应用程序的任何地方使用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
答案 1 :(得分:7)
有一个新的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();
答案 2 :(得分:5)
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'
}
}
非常感谢Christoph Peters!
答案 3 :(得分:3)
如果你试图让它在模板/ phtml文件中运行,和/或在Block的类中,你将会遇到困难。主要是因为magento(积极地)缓存您的PHTML块以达到性能目的,因此撤消任何程序流控制语句,尤其是与cookie检查相关的内容。我没有直接/冗长/深入解释为什么,但这就是我一次又一次地遇到它。
但是,您的解决方案应该是正确的,但您需要在控制器的preDispatch方法中进行检查,以避免因为控制器永远不会被缓存而提供前面提到的攻击性缓存。 (显示在您链接的问题的Nick's解决方案中。):
// 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; ?>
祝你好运!
答案 4 :(得分:3)
这是一个适用于Magento 1.7.0.2(已测试)的解决方案,并且在每个前端站点上,我在不从Mage_Adminhtml_Controller_Action扩展的控制器中使用它。
https://peters-christoph.de/tutorials/magento-pruefe-admin-session-logi-im-frontend/
答案 5 :(得分: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
变量?也许它会帮助你走上正确的轨道。
答案 6 :(得分:1)
除了尝试从adminhtml cookie中提取会话ID,这可能会或可能不会工作恕我直言,更好的只是“皮肤”页面,你需要显示在前端看起来像它并使用管理控制器,所以它将在管理会话下运行
另一个解决方案是将客户从管理员“复制”到前端并在点击页面之前将其登录,然后只需检查登录的客户是否是某个组的成员。
答案 7 :(得分:1)
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();
}?>
答案 8 :(得分: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";
谢谢, 卡希夫
答案 9 :(得分: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
的{{1}}部分设置此控制器的admin
。
答案 10 :(得分:0)
如果您正在使用cm 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);
因为如果你使用cm redis,它会用自己的模型重写db session模块。
答案 11 :(得分:-1)
检查this blog,我认为在使用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";
}