web-dev-qa-db-ja.com

Magento:管理者がフロントエンドページにログインしているかどうかを検出します

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';
}
24
Nirmal Ram

上記の解決策は機能しません!

これが機能するソリューションです(それほどクリーンではありません!しかし、これはアプリケーションの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
13
Meabed

alan stormによって書かれた新しいmagentoモジュールがあります: https://github.com/astorm/Magento_CrossAreaSessions

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

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

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

クリストフ・ペータース、どうもありがとうございました!

5
Daniel Badanjak

これはMagento1.7.0.2(テスト済み)で動作するソリューションであり、各フロントエンドサイトで、Mage_Adminhtml_Controller_Actionから拡張されていないコントローラーでこれを使用します。

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

3

テンプレート/ phtmlファイル内、および/またはブロックのクラス内でそれを機能させようとしている場合は、苦労するでしょう。主な理由は、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>

そして、これはニュースレターポップアップのブロッククラスです:

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

幸運を!

3
Seth Malaki

これは非常に単純ですが、推奨される解決策ではありません。私自身、これを行うのに何時間も費やしています。の場合、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";

ありがとう、カシフ

1
Kashif
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
Livne Berebi

このコードは機能します

//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変数をダンプしようとしましたか?多分それはあなたが正しい軌道に乗るのを助けるでしょう。

1
Sumit Bijvani

Adminhtml cookieからセッションIDをプルしようとすることは別として、IMHOは、フロントエンドのように見えるように表示する必要があるページを「スキン」し、adminコントローラーを使用してadminセッションで実行する方がよい場合があります。

別の解決策は、管理者からフロントエンドに顧客を「コピー」し、ページにアクセスする前にログインしてから、ログインした顧客が何らかのグループのメンバーであるかどうかを確認することです。

1
nesh

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セッションモジュールを独自のモデルで書き換えるからです。

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

controllerextends Mage_Adminhtml_Controller_Actionでなければならないということです

このコードをpreDispatch関数で使用できるよりも。

そして、config.xmlroutersセクションでこのコントローラーのadminを設定します。

0
user457015