2011-02-09 11 views
7

Tengo instalado un servidor web con Magento 1.4.0.1. Tengo otro sitio web que comparte credenciales con él. Logré verificar si el cliente está conectado o no (después de haber cambiado la ubicación de las cookies en Magento), pero las cosas se complicaron cuando también intenté averiguar si un administrador había iniciado sesión. Solo puedo obtener la respuesta adecuada para la primera sesión que pedí (ya sea el cliente O el administrador, el segundo nunca ha iniciado sesión).Magento - Comprobando si un administrador y un cliente están conectados

¿Cómo puedo tener ambas respuestas?

Aquí está el código que estoy usando para probar que fuera:


require_once '../app/Mage.php'; 
umask(0) ; 

Mage::app(); 

// Checking for customer session 
Mage::getSingleton('core/session', array('name'=>'frontend')); 
$session=Mage::getSingleton('customer/session', array('name'=>'frontend')); 

if ($session->isLoggedIn()) { 
    echo "Customer is logged in"; 
} else { 
    echo "Customer is not logged in"; 
} 

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

if($adminsession->isLoggedIn()) { 
    echo "Admin Logged in"; 
} else { 
    echo "Admin NOT logged in"; 
} 

Así, con el código de este tipo, el administrador no se registra en Si coloca la parte sobre el administrador primero, luego el. el cliente nunca ha iniciado sesión. Parece que me falta una línea entre las dos solicitudes.

Este puede ser el mismo problema que en esta pregunta sin respuesta: Magento how to check if admin is logged in within a module controller

Este parece ser un problema muy popular, pero no pude encontrar la solución adecuada ...

Gracias por su ayuda!

+0

El puesto que era el más cercano a una respuesta era este http://www.magentocommerce.com/boards/viewthread/50307/#t274955 pero no pude hacerlo funcionar. Otro mensaje en el mismo hilo habla de separar las dos verificaciones en diferentes archivos PHP, pero la creación de clase con la función que llamé produjo los mismos resultados ... – Melanie

Respuesta

2

Lo que debe hacer es cambiar los datos de la sesión. Usted puede hacer esto con el siguiente código:

$switchSessionName = 'adminhtml'; 
$currentSessionId = Mage::getSingleton('core/session')->getSessionId(); 
$currentSessionName = Mage::getSingleton('core/session')->getSessionName(); 
if ($currentSessionId && $currentSessionName && isset($_COOKIE[$currentSessionName])) { 
    $switchSessionId = $_COOKIE[$switchSessionName]; 
    $this->_switchSession($switchSessionName, $switchSessionId); 
    $whateverData = Mage::getModel('mymodule/session')->getWhateverData(); 
    $this->_switchSession($currentSessionName, $currentSessionId); 
} 

protected function _switchSession($namespace, $id = null) { 
    session_write_close(); 
    $GLOBALS['_SESSION'] = null; 
    $session = Mage::getSingleton('core/session'); 
    if ($id) { 
     $session->setSessionId($id); 
    } 
    $session->start($namespace); 
} 
0

Esto es lo que yo uso ..

Mage::getSingleton('core/session', array('name'=>'adminhtml')); 
$session = Mage::getSingleton('admin/session');; 
if (!$session->getUser()) 
{ 
    die("You aren't an admin!"); 
} 
+0

Gracias, pero en mi caso, ambos usuarios no son lo mismo (tenemos cuenta separada de administrador y cliente). Así que todavía tengo el mismo problema: no hay nada en getUser() cuando se comprueba la sesión de administrador después de la sesión del cliente. – Melanie

4

he encontrado que "-función de error" desde otro ángulo de visión (intentar abrirse una sesión al cliente de adminside), pero todavía encontrado la causa.

El problema es con la función session_name(). Si vas a Mage_Core_Model_Session_Abstract_Varien, verás que el objeto de sesión utiliza funciones de sesión estándar de PHP y PHP no puede manejar dos sesiones al mismo tiempo.

Su ID de sesión para el administrador se almacena en cookie adminhtml, mientras que para el cliente, su ID de sesión está en la cookie de interfaz. Luego, en el lado de administración, tiene la ID de sesión inicializada por la cookie de adminhtml. Cuando está en administración, su objeto cliente/sesión se almacena dentro de algo como $ _SESSION ['customer'] (no ha verificado la clave exacta) dentro de la sesión de PHP para ID almacenado en cookie adminhtml. Esto significa que el objeto cliente/sesión hace referencia a diferentes sesiones cuando se encuentra dentro de las partes administrativas y de clientes de magento.

+0

Hola Zebooka! ¡Gracias por tu explicación! Lo he leído varias veces, pero mi cerebro no lo hace desde entonces para evitarlo. Obtengo ese cliente y el administrador usa una cookie diferente. Entiendo que PHP solo reconoce una sesión en ese momento. Ahora la parte que no estoy seguro es sobre si puedo o no excavar el $ _SESSION para encontrar el objeto del cliente desde el lado de la administración y cómo hacerlo. Imprimí $ _SESSION y es una gran variedad ... sin clave de "cliente". He comparado el contenido cuando un cliente está conectado y no, pero no surge ninguna diferencia ... – Melanie

+1

Solo tiene una sesión en PHP. Magento usa diferentes cookies (adminhtml y frontend) para el lado administrativo y el lado del cliente. Los modelos admin/session y customer/session se guardan dentro de $ _SESSION con algunas teclas de matriz (por ejemplo, administrador y cliente). Pero la matriz $ _SESSION es diferente cuando se está en el lado de administrador y en el lado del cliente, porque tiene diferentes ID de sesión en diferentes cookies de sesión (adminhtml y frontend). La única forma de acceder a la sesión frontend es obtener contenido de la interfaz de la interfaz y, de alguna manera, cargar manualmente el modelo cliente/sesión con los contenidos de var/session/sess_SESSIONID. – Zebooka

-2

Aquí es un simple script para comprobar administrador se registra o no y si se inicia sesión get detalles de administración de Magento.You pueden llamar a la sesión y la llamada a la función del usuario a obtener todos los detalles

$userDetails = Mage::getSingleton('admin/session'); // Get data from the session 
$userID  = $userDetails->getUser()->getUserId(); // Get user ID 
$userID  = $userDetails->getUser()->getEmail(); // Get user Email 

favor refiérase a http://webexplorar.com/magento-admin-details/ para más detalles.

+0

Esta es básicamente la misma respuesta que Dalton, no soluciona el problema de cambiar de sesión. – Melanie

0

Es bastante simple, pero no es una solución recomendada. Yo mismo gasto horas para hacer esto. Para, ventanas de oportunidad basada en servidor a continuación solución:

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

Para, servidor basado en Linux tratar a continuación la solución:

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

Gracias, Kashif

Cuestiones relacionadas