2011-02-09 7 views
7

Mam serwer WWW z zainstalowanym Magento 1.4.0.1. Mam inną stronę internetową, która udostępnia referencje. Udało mi się sprawdzić, czy klient jest zalogowany, czy nie (po zmianie lokalizacji plików cookie w Magento), ale sprawy się skomplikowały, gdy próbowałem dowiedzieć się, czy zalogowany jest administrator. Mogę uzyskać tylko właściwą odpowiedź na pierwszą sesję, o którą prosiłem (albo klienta, albo administratora, drugi nigdy się nie loguje).Magento - Sprawdzanie, czy administrator i klient są zalogowani

Jak mogę uzyskać obie odpowiedzi?

Oto kod używam do testowania, że ​​spośród:


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

Więc z kodem jak ta, administrator nie jest zalogowany Jeśli umieścisz część o opiekunie pierwszy, wtedy. klient nigdy nie jest zalogowany. Wygląda na to, że brakuje mi linii między tymi dwoma żądaniami.

To może być ten sam problem niż to pytanie bez odpowiedzi: Magento how to check if admin is logged in within a module controller

Wydaje się popularny problem, ale nie mogłem znaleźć właściwego rozwiązania ...

Dzięki za pomoc!

+0

Post który był najbliżej odpowiedź była ten jeden http://www.magentocommerce.com/boards/viewthread/50307/#t274955, ale nie mogłem go uruchomić. Kolejna wiadomość w tym samym wątku mówi o rozdzieleniu dwóch weryfikacji na inny plik PHP, ale tworzenie klasy z funkcją, którą wywołałem, dało te same wyniki ... – Melanie

Odpowiedz

2

Co trzeba zrobić, to zmienić dane sesji. Można to zrobić za pomocą następującego kodu:

$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

Oto co mogę użyć ..

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

Dzięki, ale w moim przypadku obaj użytkownicy nie są tym samym (mamy oddzielone konto administratora i klienta). Nadal mam ten sam problem: nie ma niczego w funkcji getUser(), gdy sesja administratora jest sprawdzana po sesji klienta. – Melanie

4

Odkryłam, że „bug-feature” z innego kąta widzenia (próby logowania klienta z adminside), ale jeszcze znaleźć przyczynę.

Problem dotyczy funkcji session_name(). Jeśli przejdziesz do Mage_Core_Model_Session_Abstract_Varien zobaczysz, że obiekt sesji używa standardowych funkcji sesji PHP, a PHP nie może obsługiwać dwóch sesji w tym samym czasie.

Identyfikator sesji użytkownika adminside jest przechowywany w pliku cookie adminhtml, natomiast dla klienta identyfikator sesji użytkownika znajduje się w pliku cookie Frontend. Następnie w adminside masz identyfikator sesji zainicjowany przez plik cookie adminhtml. Kiedy jesteś w administracji, twój klient/obiekt sesji jest przechowywany w czymś takim jak $ _SESSION ['customer'] (nie sprawdziłeś dokładnego klucza) w sesji PHP dla identyfikatora przechowywanego w pliku cookie adminhtml. Oznacza to, że obiekt klient/sesja odwołuje się do różnych sesji, gdy znajduje się w części administracyjnej i klienckiej magento.

+0

Cześć Zebooka! Dziękuję za wyjaśnienie! Przeczytałem to już kilka razy, ale mój mózg nie musi tego obchodzić! Dostaję tego klienta, a administrator używa innego pliku cookie. Rozumiem, że PHP rozpoznaje tylko jedną sesję w tym czasie. Teraz część, której nie jestem pewien, dotyczy tego, czy mogę wykopać $ _SESSION, aby znaleźć obiekt klienta od strony administratora i jak to zrobić. Wydrukowałem $ _SESSION i jest to OGROMNA tablica .. bez klucza "klienta". Porównywałem zawartość, gdy klient jest zalogowany, ale nie ma różnicy ... – Melanie

+1

Masz tylko jedną sesję w PHP. Magento używa różnych plików cookie (adminhtml i frontend) po stronie administratora i klienta. Modele admin/session i customer/session są zapisywane w $ _SESSION z niektórymi kluczami tablicy (na przykład admin i customer). Ale tablica $ _SESSION jest inna, gdy jesteś po stronie administratora i po stronie klienta - ponieważ masz różne identyfikatory sesji w różnych ciasteczkach sesji (adminhtml i frontend). Jedynym sposobem uzyskania dostępu do sesji frontendowej jest pobranie zawartości cookie z frontendu i ręczne załadowanie modelu klienta/sesji z zawartością zmiennej/session/sess_SESSIONID. – Zebooka

-2

Oto prosty skrypt, aby sprawdzić administrator jest zalogowany czy nie, a jeśli rejestrowane dane get Administrator Magento.You mogą dzwonić do sesji i wywołanie funkcji użytkownika do uzyskać wszystkie szczegóły.

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

Aby uzyskać więcej informacji, patrz http://webexplorar.com/magento-admin-details/.

+0

Jest to w większości ta sama odpowiedź niż Dalton, nie rozwiązuje problemu przełączania sesji. – Melanie

0

Jest to dość proste, ale nie zalecane rozwiązanie. Sam poświęcę na to wiele godzin. Bo windows try serwer poniżej rozwiązanie:

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

Na serwer oparty Linux spróbować poniżej rozwiązanie:

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

Dzięki Kashif

Powiązane problemy