web-dev-qa-db-fra.com

Magento: Détecter si l'administrateur est connecté aux pages frontales

J'ai créé une extension magento. Je veux implémenter l'accès à l'extension. L'extension crée une page dans le frontend et je veux que seul l'administrateur y accède. Donc, fondamentalement, j'ai besoin de quelque chose qui détecte que si l'administrateur est connecté dans les pages frontales.

J'ai essayé plusieurs solutions mais notant semblent fonctionner.

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

Vérifiez sur le frontend si l'administrateur est connecté

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

Les solutions ci-dessus ne fonctionnent pas!

Voici une solution qui fonctionne (ce n'est pas si propre! Mais cela fonctionnera n'importe où dans votre application en vue ou modèle phtml ou en contrôleur ou assistant!)

$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

il existe un nouveau module magento, écrit par 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 a posté un lien qui a résolu mon problème (Détecter si l'administrateur est connecté dans les pages frontales):

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

Merci beaucoup Christoph Peters!

4
Daniel Badanjak

Voici une solution qui fonctionne avec Magento 1.7.0.2 (testé) et sur chaque site frontal, je l’utilise dans un contrôleur ne s’étendant pas de Mage_Adminhtml_Controller_Action.

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

3
Christoph Peters

Si vous essayez de le faire fonctionner dans les fichiers template/phtml, et/ou dans la classe de Block, vous allez avoir du mal à le faire. Principalement parce que magento (de manière agressive) met en cache vos blocs PHTML à des fins de performance, annulant ainsi toutes les instructions de contrôle de flux de programme que vous avez, en particulier concernant la vérification des cookies. Je n'ai pas d'explication directe/longue/approfondie pourquoi, mais c'est comme ça que je l'ai rencontré encore et encore. 

Cependant, votre solution doit être correcte, mais vous devez effectuer la vérification à l'aide de la méthode preDispatch du contrôleur afin d'éviter les caches agressifs susmentionnés car les contrôleurs ne sont jamais mis en cache. (indiqué dans Nick's solution dans la question que vous avez liée.):

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

SI vous avez vraiment besoin d'effectuer les vérifications ci-dessus à l'intérieur de fichiers PHTML ou de blocs nommés, consultez le code suivant sur la façon de désactiver la mise en cache au niveau du bloc et éventuellement pour que cela fonctionne. Ce que je faisais auparavant était de désactiver la mise en cache pour le bloc de pied de page (dans lequel le bloc enfant, et non le phtml, contient du code à vérifier
pour un cookie spécifique)

Tout d’abord, l’appel de blocage (trouvé dans votre fichier local.xml, dans la mise à jour de présentation de module XML ou ailleurs, où que vous puissiez faire des mises à jour de présentation, vraiment. Je préfère diviser mes personnalisations en modules; la mise à jour de présentation de module xml est donc la voie à suivre). :

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

Et voici la classe de bloc de 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.
    }
}

Et le phtml serait quelque chose comme:

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

Bonne chance!

3
Seth Malaki

C'est assez simple mais pas une solution recommandée. Je passe moi-même plusieurs heures à faire cela. Pour un serveur Windows, essayez la solution ci-dessous:

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

Pour, serveur basé sur Linux essayez la solution ci-dessous:

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

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

Ce code fonctionnera

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

OU

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

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

Avez-vous essayé de vider la variable $_SESSION? Peut-être que cela vous aidera à aller sur la bonne voie.

1
Sumit Bijvani

Mis à part essayer d’extraire l’identifiant de session du cookie adminhtml, qui peut ne pas fonctionner à mon humble avis, il est préférable de «skinner» la page dont vous avez besoin pour montrer qu’elle ressemble à son interface et qu’elle utilise le contrôleur d’admin pour qu’elle s’exécute sous une session admin.

Une autre solution consiste à "copier" le client d'administrateur à l'interface frontale et à les connecter avant de cliquer sur votre page. Il suffit ensuite de vérifier si le client connecté est membre d'un groupe.

1
nesh

Si vous utilisez la session cm redis, essayez ceci: (a travaillé pour moi)

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

parce que si vous utilisez cm redis, son module rewrites db session avec son propre modèle.

0
Uğur Taşdildiren

La clé pour pouvoir utiliser:

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

est-ce que la controller doit extends Mage_Adminhtml_Controller_Action 

que vous pouvez utiliser ce code dans la fonction preDispatch.

Et configurez la routers pour ce contrôleur dans la section admin de votre config.xml.

0
user457015