it-swarm.com.de

Magento: Ermitteln Sie, ob der Administrator auf Frontendseiten angemeldet ist

Ich habe eine Magento-Erweiterung erstellt. Ich möchte den Zugriff auf die Erweiterung implementieren. Die Erweiterung erstellt eine Seite im Frontend und ich möchte, dass nur der Administrator auf diese Seite zugreift. Grundsätzlich brauche ich etwas, das erkennen würde, ob der Admin in Frontendseiten eingeloggt ist.

Ich habe mehrere Lösungen ausprobiert, aber das scheint zu funktionieren.

if(Mage::getSingleton('admin/session', array('name' => 'adminhtml'))->isLoggedIn()) echo 'logged in'; else echo 'not logged in';

Prüfen Sie am Frontend, ob der Admin angemeldet ist

Mage::getSingleton('core/session', array('name'=>'adminhtml'));
$adminSession = Mage::getSingleton('admin/session');
$adminSession->start();
if ($adminSession->isLoggedIn()) {
   echo 'logged in';
}
23
Nirmal Ram

Die oben genannten Lösungen funktionieren nicht!

Hier ist eine Lösung, die funktioniert (es ist nicht so sauber! Dies funktioniert jedoch überall in Ihrer Anwendung in der HTML-Ansicht oder im Modell oder Controller oder Helfer!)

$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
12
Meabed

es gibt ein neues magento-modul, geschrieben von 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();
7
Kevin Horst

Christoph Peters hat einen Link gepostet, der mein Problem gelöst hat (Erkennen, ob der Admin auf den Frontendseiten angemeldet ist):

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

Vielen Dank Christoph Peters!

4
Daniel Badanjak

Hier ist eine Lösung, die mit Magento 1.7.0.2 (getestet) funktioniert, und auf jeder Frontend-Site verwende ich diese in einem Controller, der nicht von Mage_Adminhtml_Controller_Action ausgeht.

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

3

Wenn Sie versuchen, es in den template/phtml-Dateien und/oder in der Klasse Block zu arbeiten, wird es Ihnen schwer fallen. Hauptsächlich, weil Magento Ihre PHTML-Blöcke (zu aggressiven Zwecken) zu Leistungszwecken zwischenspeichert, wodurch alle Anweisungen zur Programmablaufsteuerung rückgängig gemacht werden, die Sie speziell im Zusammenhang mit der Cookie-Prüfung haben. Ich habe keine direkte/langwierige/ausführliche Erklärung dafür, aber so bin ich immer wieder darauf gekommen. 

Ihre Lösung sollte jedoch korrekt sein, aber Sie müssen die Überprüfung innerhalb der preDispatch-Methode eines Controllers durchführen, um die oben genannten aggressiven Caches zu vermeiden, da Controller niemals zwischengespeichert werden. (In Nick's solution in der Frage, die Sie verlinkt haben.):

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

Wenn Sie wirklich die oben genannten Überprüfungen in PHTML-Dateien oder benannten Blöcken durchführen müssen, lesen Sie den folgenden Code zum Deaktivieren der Zwischenspeicherung auf Blockebene und möglicherweise . Was ich zuvor getan habe, war das Caching für den Footer-Block zu deaktivieren (in dem der untergeordnete Block, nicht PHP, zu prüfender Code enthält
für ein bestimmtes Cookie)

Zunächst einmal den Block-Aufruf (in Ihrer local.xml oder in der XML-Datei für das Modullayout-Update oder überall dort, wo Sie Layout-Aktualisierungen durchführen können. Ich ziehe es vor, meine Anpassungen in Module aufzuteilen, sodass auf jeden Fall XML-Modullayout-Update erforderlich ist.) :

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

Und das ist die Blockklasse des Newsletterpopups:

<?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.
    }
}

Und der phtml wäre ungefähr so:

<?php if($this->canRender()): ?>
   // stuff
<?php endif; ?>

Viel Glück!

3
Seth Malaki

Es ist ziemlich einfach, aber keine empfohlene Lösung. Ich selbst verbringe mehrere Stunden damit. Für Windows-basierte Server versuchen Sie die Lösung:

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

Für Linux-basierte Server versuchen Sie folgende Lösung:

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

Danke, Kashif

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

Dieser Code wird funktionieren

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

ODER

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

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

Haben Sie versucht, die Variable $_SESSION zu sichern? Vielleicht hilft es Ihnen, auf die richtige Spur zu kommen.

1
Sumit Bijvani

Abgesehen davon, dass versucht wird, die Sitzungs-ID aus dem Adminhtml-Cookie zu ziehen, was möglicherweise funktioniert oder nicht funktioniert, ist IMHO besser, um die "Skin" -Seite zu öffnen, die Sie anzeigen müssen, damit sie im Frontend aussieht und den Admin-Controller verwendet, damit sie unter der Administrationssitzung ausgeführt wird.

Eine andere Lösung besteht darin, den Kunden von Admin auf das Frontend zu "kopieren" und vor dem Aufrufen Ihrer Seite einzuloggen. Anschließend müssen Sie nur überprüfen, ob der eingeloggte Kunde Mitglied einer Gruppe ist.

1
nesh

Wenn Sie eine cm redis-Sitzung verwenden, versuchen Sie Folgendes: (hat für mich funktioniert)

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

denn wenn Sie cm redis verwenden, schreibt es das db-Sitzungsmodul mit einem eigenen Modell um.

0

Der Schlüssel, um verwenden zu können:

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

ist, dass die controller muss extends Mage_Adminhtml_Controller_Action 

dann können Sie diesen Code in der Funktion preDispatch verwenden.

Und richten Sie die routers für diesen Controller im Abschnitt admin Ihres config.xml ein.

0
user457015