php Magento: पता लगाएँ कि व्यवस्थापक फ्रंट पेज में व्यवस्थापक लॉग इन है या नहीं




magento-1.7 administration (10)

Adminhtml कुकी से सत्र आईडी खींचने की कोशिश करने के अलावा, जो आईएमएचओ काम कर सकता है या नहीं कर सकता है, केवल "त्वचा" पृष्ठ के लिए बेहतर है, आपको इसके सामने की तरह दिखने और व्यवस्थापक नियंत्रक का उपयोग करने के लिए दिखाने की ज़रूरत है ताकि यह व्यवस्थापक सत्र के तहत चलाए जा सके।

एक और समाधान है कि ग्राहक को व्यवस्थापक से "प्रतिलिपि" करें और अपने पृष्ठ पर क्लिक करने से पहले उन्हें लॉग इन करें और फिर यह जांचने की बात है कि ग्राहक में लॉग इन किया गया है, तो कुछ समूह का सदस्य है।

मैंने एक Magento एक्सटेंशन बनाया है। मैं विस्तार तक पहुंच को कार्यान्वित करना चाहता हूं। एक्सटेंशन फ्रंट पेज में एक पेज बनाता है और मैं केवल उस पृष्ठ तक पहुंचने के लिए व्यवस्थापक चाहता हूं। तो मूल रूप से मुझे ऐसा कुछ चाहिए जो यह पता लगाएगा कि यदि व्यवस्थापक फ्रंट पेजों में लॉग इन है।

मैंने कई समाधानों की कोशिश की है लेकिन काम करना प्रतीत होता है।

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

यदि व्यवस्थापक लॉग इन है तो फ्रंटएंड पर जांचें

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

यदि आप सेमी रेडिस सत्र का उपयोग कर रहे हैं तो इसे आजमाएं: (मेरे लिए काम किया)

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

क्योंकि यदि आप सेमी रेडिस का उपयोग कर रहे हैं तो इसके अपने मॉडल के साथ डीबी सत्र मॉड्यूल को फिर से लिखना है।


उपर्युक्त समाधान काम नहीं करते हैं!

यहां एक समाधान है जो काम करता है (यह साफ नहीं है! लेकिन यह आपके एप्लिकेशन में कहीं भी PHP दृश्य या मॉडल या नियंत्रक या सहायक में काम करेगा!)

$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

यह कोड काम करेगा

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

या

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

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

क्या आपने $_SESSION चर को डंप करने का प्रयास किया था? शायद यह आपको सही रास्ते पर जाने में मदद करेगा।


यदि आप इसे टेम्पलेट / phtml फ़ाइलों के भीतर काम करने की कोशिश कर रहे हैं, और / या ब्लॉक की कक्षा के अंदर आपको कठिन समय लगेगा। मुख्य रूप से क्योंकि Magento (आक्रामक) प्रदर्शन उद्देश्यों के लिए आपके PHTML ब्लॉक को कैश करता है इस प्रकार किसी भी प्रोग्राम फ्लो कंट्रोल स्टेटमेंट को पूर्ववत करता है जिसमें आपके पास विशेष रूप से कुकी जांच से संबंधित सामान होते हैं। मेरे पास कोई प्रत्यक्ष / लंबा / इंडिप स्पष्टीकरण क्यों नहीं है, लेकिन यह वही है कि मैंने इसे बार-बार कैसे सामना किया है।

हालांकि, आपका समाधान सही होना चाहिए, लेकिन आपको नियंत्रक की प्रीडिस्चैच विधि के भीतर चेक करने की आवश्यकता है ताकि उपरोक्त आक्रामक कैश से बचने के लिए नियंत्रक कभी कैश नहीं किए जाते हैं। (आपके द्वारा लिंक किए गए प्रश्न में Nick's समाधान में दिखाया गया है।):

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

यदि आपको वास्तव में PHTML फ़ाइलों या नामित ब्लॉक के अंदर उपरोक्त चेक करने की आवश्यकता है, तो ब्लॉक-स्तर कैशिंग को बंद करने और संभवतः इसे कार्य करने के तरीके पर निम्न कोड देखें। मैंने पहले जो किया वह पाद लेख ब्लॉक के लिए कैशिंग अक्षम था (जिसमें बच्चे ब्लॉक, पीएचटीएम नहीं, चेक करने के लिए कोड शामिल है
एक विशिष्ट कुकी के लिए)

सबसे पहले, ब्लॉक कॉल (आपके स्थानीय.एक्सएमएल, या मॉड्यूल लेआउट अपडेट एक्सएमएल में पाया गया है, या कहीं भी आप लेआउट अपडेट कर सकते हैं, वास्तव में। मैं मॉड्यूल में अपने अनुकूलन को तोड़ना पसंद करता हूं इसलिए निश्चित रूप से मॉड्यूल लेआउट अपडेट एक्सएमएल जाने का तरीका है) :

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

और यह न्यूज़लेटरपॉप की ब्लॉक क्लास है:

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

और PHP कुछ ऐसा होगा:

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

सौभाग्य!


उपयोग करने में सक्षम होने की कुंजी:

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

यह है कि controller को extends Mage_Adminhtml_Controller_Action को extends Mage_Adminhtml_Controller_Action करना होगा

आप इस कोड का उपयोग preDispatch फ़ंक्शन में कर सकते हैं।

और अपने config.xml के admin अनुभाग में इस नियंत्रक के लिए routers सेट करें।


इस ब्लॉग को जांचें, मुझे लगता है कि आपको isLoggedIn() से जांचने से पहले start() से जांचना नहीं है।

Mage::getSingleton('core/session', array('name'=>'adminhtml')); // get sessions

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

    if($check->isLoggedIn()) { //check is admin logged in
        echo "Admin is logged in";
    } else {
        echo "Admin is offline";
    }

क्रिस्टोफ पीटर्स ने एक लिंक पोस्ट किया जिसने मेरी समस्या हल की (पता लगाएं कि व्यवस्थापक फ्रंट पेजों में लॉग इन है या नहीं):

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

क्रिस्टोफ पीटर्स बहुत बहुत धन्यवाद!


यहां एक समाधान है जो यह Magento 1.7.0.2 (परीक्षण) और प्रत्येक फ्रंटेंड साइट पर काम करता है, मैं इसे एक नियंत्रक में उपयोग करता हूं जो Mage_Adminhtml_Controller_Action से विस्तार नहीं कर रहा है।

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


एलन तूफान द्वारा लिखित एक नया Magento मॉड्यूल है: https://github.com/astorm/Magento_CrossAreaSessions सत्र

$adminhtml  = Mage::getModel('pulsestorm_crossareasession/manager')->getSessionData('adminhtml');

$adminUser = $dataAdminhtml['admin']['user'];
$loggedIn = $adminUser->getId() && $adminUser->getIsActive();