2011-02-09 28 views
7

Tôi có máy chủ web có cài đặt Magento 1.4.0.1 không. Tôi có một trang web khác chia sẻ thông tin xác thực với trang web đó. Tôi đã kiểm tra xem khách hàng có đăng nhập hay không (sau khi đã thay đổi vị trí cookie trong Magento), nhưng mọi thứ trở nên phức tạp khi tôi cũng cố gắng tìm hiểu xem quản trị viên đã đăng nhập chưa. Tôi chỉ có thể nhận được câu trả lời đúng cho phiên đầu tiên tôi đã yêu cầu (khách hàng HOẶC quản trị viên, phiên thứ hai KHÔNG BAO GIỜ đăng nhập).Magento - Kiểm tra xem Quản trị viên và Khách hàng có đăng nhập

Tôi có thể có cả hai câu trả lời như thế nào?

Đây là mã tôi đang sử dụng để kiểm tra mà ra:


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

Vì vậy, với các mã như thế này, các quản trị viên không bao giờ đăng nhập Nếu bạn đặt các phần về quản trị đầu tiên, sau đó các. khách hàng chưa bao giờ đăng nhập. Có vẻ như tôi đang thiếu một dòng giữa hai yêu cầu.

Đây có thể là cùng một vấn đề hơn câu hỏi chưa được trả lời này: Magento how to check if admin is logged in within a module controller

Điều này có vẻ như là một vấn đề phổ biến, nhưng tôi không thể tìm ra giải pháp thích hợp ...

Nhờ sự giúp đỡ của bạn!

+0

Các bài đó là gần nhất với một câu trả lời là cái này http://www.magentocommerce.com/boards/viewthread/50307/#t274955 nhưng tôi không thể làm cho nó hoạt động được. Một thông điệp khác trong cùng một bài nói chuyện về việc tách hai xác minh thành tệp PHP khác nhau, nhưng tạo lớp với hàm mà tôi gọi là tạo ra cùng một kết quả ... – Melanie

Trả lời

2

Điều bạn cần làm là chuyển dữ liệu phiên. Bạn có thể làm điều này với đoạn mã sau:

$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

Dưới đây là những gì tôi sử dụng ..

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

Cảm ơn, nhưng trong trường hợp của tôi, cả hai người dùng không giống nhau (chúng tôi có quản trị viên và tài khoản khách hàng được tách riêng). Vì vậy, tôi vẫn có cùng một vấn đề: không có gì trong getUser() khi phiên quản trị viên được kiểm tra sau phiên khách hàng. – Melanie

4

tôi đã tìm thấy rằng "lỗi-tính năng" từ một góc nhìn (cố gắng để đăng nhập khách hàng từ adminside), nhưng vẫn tìm ra nguyên nhân.

Sự cố xảy ra với hàm session_name(). Nếu bạn đi đến Mage_Core_Model_Session_Abstract_Varien bạn sẽ thấy ở đó đối tượng session đang sử dụng các hàm session của PHP và PHP không thể xử lý hai phiên cùng một lúc.

Id phiên của bạn cho quản trị viên được lưu trữ trong cookie adminhtml, trong khi đối với khách hàng, id phiên của bạn nằm trong cookie giao diện người dùng. Sau đó, trong quản trị viên, bạn có ID phiên được khởi tạo bởi cookie adminhtml. Khi trong adminside, đối tượng khách hàng/phiên của bạn được lưu trữ bên trong cái gì đó như $ _SESSION ['customer'] (chưa kiểm tra khóa chính xác) bên trong phiên PHP cho ID được lưu trữ trong cookie adminhtml. Điều này có nghĩa là đối tượng khách/phiên đang tham chiếu đến các phiên khác nhau khi bên trong phần quản trị và khách hàng của Magento.

+0

Xin chào Zebooka! Cảm ơn lời giải thích của bạn! Tôi đã đọc nó nhiều lần rồi, nhưng bộ não của tôi không từ đó để có được nó! Tôi nhận được rằng khách hàng và quản trị viên sử dụng một cookie khác. Tôi hiểu rằng PHP chỉ nhận ra một phiên vào thời điểm đó. Bây giờ phần tôi không chắc chắn, là về việc có hay không tôi có thể đào $ _SESSION để tìm đối tượng khách hàng từ phía quản trị viên và cách thực hiện. Tôi đã in ra $ _SESSION và nó là một mảng HUGE .. không có khóa 'khách hàng'. Tôi đã so sánh nội dung khi khách hàng đăng nhập và không, nhưng không có sự khác biệt phát sinh ... – Melanie

+1

Bạn chỉ có một phiên trong PHP. Magento sử dụng các cookie khác nhau (adminhtml và giao diện người dùng) cho phía quản trị viên và phía máy khách. Các mô hình admin/phiên và khách hàng/phiên được lưu bên trong $ _SESSION với một số phím mảng (nói admin và khách hàng). Nhưng mảng $ _SESSION khác khi bạn ở phía quản trị viên và phía máy khách - bởi vì bạn có các ID phiên khác nhau trong các cookie phiên khác nhau (adminhtml và giao diện người dùng). Cách duy nhất để truy cập phiên giao diện người dùng là lấy nội dung cookie giao diện người dùng và bằng cách nào đó tải mô hình phiên khách/phiên theo cách thủ công bằng nội dung của var/session/sess_SESSIONID. – Zebooka

-2

Đây là một kịch bản đơn giản để kiểm tra quản trị được đăng nhập hay không và nếu đăng nhập chi tiết get admin của Magento.You có thể gọi đến các phiên họp và các cuộc gọi đến chức năng người dùng nhận tất cả các chi tiết.

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

Vui lòng tham khảo http://webexplorar.com/magento-admin-details/ để biết thêm chi tiết.

+0

Điều này chủ yếu là cùng một câu trả lời so với Dalton, nó không khắc phục được vấn đề chuyển đổi phiên. – Melanie

0

Nó khá đơn giản nhưng không phải là giải pháp được đề xuất. Bản thân tôi dành hàng giờ để làm điều này. Ví, cửa sổ dựa trên máy chủ thử dưới đây giải pháp:

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

Đối, Linux dựa trên máy chủ thử dưới đây giải pháp:

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

Cảm ơn, Kashif

Các vấn đề liên quan