2013-04-05 86 views
22

我創建了一個Magento的擴展前端頁面登錄。我想實現對擴展的訪問。該擴展在前端創建一個頁面,我只需要管理員訪問該頁面。所以基本上我需要的東西,可以檢測到,如果管理員登錄在前端頁面。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'; 
} 

回答

-1

檢查this blog,我覺得你不必與isLoggedIn()檢查之前start()檢查。

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"; 
    } 
+0

謝謝,已經檢查,它也不起作用。 – 2013-04-05 10:25:34

+0

此處不起作用 – user457015 2013-04-13 17:36:13

+1

您的模塊的adminhtml控制器應該從'Mage_Adminhtml_Controller_Action'擴展。否則你不能檢查管理員是否登錄。 – 2013-04-16 13:38:16

3

如果你想讓它在template/phtml文件和/或Block類內工作,你將會很難。主要是因爲Magento的(積極)緩存您的PHTML塊提高性能的目的。因此,請撤消所有程序流程控制語句,你有特別的東西用餅乾檢查有關。我沒有直接/冗長/深入的解釋,但這就是我一遍又一遍地遇到它的原因。

然而,你的解決方案應該是正確的,但你需要做一個控制器的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; ?> 

祝你好運!

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功能使用此代碼。

並在​​3210的admin部分設置該控制器的routers

+0

如果控制器會擴展'Mage_Adminhtml_Controller_Action'那麼爲什麼我會問這個問題。謝謝,但我的控制器擴展了前端控制器,如果我通過adminhtml擴展它,那麼它將重定向到後端。 – 2013-04-19 05:51:32

+0

您可以通過頁面看起來像前端(no/admin)的方式設置路由並擴展Mage_Adminhtml_Controller_Action。那麼,我已經爲我工作。 – user457015 2013-04-20 22:15:46

11

上述解決方案不起作用!

這裏是一個有效的解決方案(它不是那麼幹淨!但是這將在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

奇怪,根本不適用於我,無論如何報告虛假(v 1.7.0.2) – joren 2013-05-28 14:46:59

+0

$ session的價值是多少?回聲和粘貼http://pastebin.com/ – Meabed 2013-05-28 15:10:51

+0

空,但我發現這是一個問題,管理會話不可用時,在前端頁面上(我試圖在CMS頁面上運行此操作) – joren 2013-05-28 19:28:43

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

OR

$adminsession = Mage::getSingleton('admin/session', array('name'=>'adminhtml')); 

if($adminsession->isLoggedIn()) { 
    //do stuff 
} else { 
    echo "404 page not found"; 
} 

您是否嘗試轉儲$_SESSION變量?也許它會幫助你走上正確的軌道。

+0

沒有人這不起作用。無論是在控制器,型號還是區塊中。 – 2013-04-19 05:52:19

+0

@NirmalRam它會工作,因爲它在工作,你正在使用哪個版本的magento? – 2013-04-19 05:57:15

+0

我正在使用社區1.7。它不起作用。讓我解釋一下。我創建了一個擴展,並擴展了前端控制器,並將其顯示在前端。我只是希望可以通過管理員訪問。 – 2013-04-19 06:02:10

1

除了試圖從adminhtml cookie,這可能會或可能不會工作恕我直言,更好的只是「皮膚」頁你需要顯示看起來像它在前端和使用管理控制器,所以它將運行在管理下會話。

另一種解決方案是將客戶從管理員複製到前端,然後在點擊頁面之前將其登錄,然後檢查登錄的客戶是否屬於某個組。

+0

謝謝我已經將此作爲臨時解決方案。但我需要我的擴展程序只能由管理員訪問,它將在前端。 – 2013-04-19 05:58:31

3

這是一個解決方案,這與Magento 1.7.0.2(測試),並在每個前端網站上使用,我用這個控制器不是從Mage_Adminhtml_Controller_Action擴展。

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

+0

從這裏發佈的所有解決方案,這是一個工作.. 用於fronAction控制器 – DepH 2014-05-13 04:27:32

+0

這是唯一的解決方案,這對我來說。我需要在一個.phtml文件中進行測試,並且正確地登錄和註銷admin以及它的響應。 – 2014-09-09 21:38:46

+0

是的,這讓我今天非常緊張...非常感謝。這裏有一個精簡的版本: if(array_key_exists('adminhtml',$ _COOKIE)){ $ sessionFilePath = Mage :: getBaseDir('session')。DS.'sess_'。$ _COOKIE [ 'adminhtml']; \t $ sessionFile = file_get_contents($ sessionFilePath); \t $ oldSession = $ _SESSION; \t session_decode($ sessionFile); \t $ adminSessionData = $ _SESSION; \t $ _SESSION = $ oldSession; \t } 如果(array_key_exists( '用戶',$ adminSessionData [ '管理員'])){$ adminUserObj = $ adminSessionData [ '管理員'] [ '用戶']; ($ adminUserObj){ } if($ adminUserObj){ \t // var_dump($ adminUserObj); } else { \t header(「Location:/」); \t die(); } – Abbey 2015-02-17 20:23:08

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

這是很簡單的,但不是推薦的解決方案。我自己花了數小時來做到這一點。 因爲,基於Windows Server嘗試以下解決方案:

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

感謝, 卡希夫

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

非常感謝Christoph Peters!

+0

我已經試過這段代碼的很多版本,這是唯一爲我工作的。不知道爲什麼其他人不開心,但我現在開始了。非常感謝Christoph Peters,確實! – Wildcard27 2016-04-08 02:02:42

7

有一個新的Magento的模塊,由阿蘭風暴寫着:https://github.com/astorm/Magento_CrossAreaSessions

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

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

該解決方案工作正常,但如果沒有backenduser登錄,則會出現錯誤,因爲'$ adminUser'爲'null',並且您嘗試''null'上的'getId()'。我建議在設置'$ loggedIn'前檢查'if($ adminUser)',否則默認爲'false'。 – Andreas 2017-02-01 10:30:25

0

如果您正在使用釐米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重寫數據庫會話模塊與自己的模型。