बैकएंड से फ्रंटलाइन पर ऑटोलॉगिन


15

निम्न परिदृश्य देखें।
मेरे पास कुछ कस्टम मॉड्यूल हैं जो फ्रंटएंड उपयोगकर्ता को कुछ कस्टम संस्थाओं पर कुछ क्रियाएं करने की अनुमति देता है। (विवरण वास्तव में महत्वपूर्ण नहीं हैं)।
अनुरोध यह है कि एक व्यवस्थापक को ग्राहक खाते (पासवर्ड के बिना) के साथ फ्रंटएंड पर लॉगिन करने में सक्षम होना चाहिए और ग्राहक के लिए उन कार्यों को करने में सक्षम होना चाहिए।
चूंकि आप बैकएंड से फ्रंटेंड सत्र का उपयोग नहीं कर सकते हैं और मैं फ्रंटएंड के लिए एक स्थायी ऑटोलॉगिन लिंक नहीं बनाना चाहता हूं क्योंकि यह एक बड़ा सुरक्षा छेद हो सकता है जो मैंने अब तक किया है।

  • ग्राहक इकाई के लिए एक खाली विशेषता जोड़ें। (चलो इसे कॉल करें login_key)
  • ग्राहक संपादित पृष्ठ पर बैकएंड में एक बटन जोड़ें जो एक व्यवस्थापक पृष्ठ पर रीडायरेक्ट करता है जहां एक यादृच्छिक स्ट्रिंग उत्पन्न होता है और विशेषता में सहेजा जाता है login_key
  • एक ही कार्रवाई में मैं इस तरह autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(पिछले चरण में उत्पन्न मूल्य) के लिए एक सीमा url के लिए व्यवस्थापक पुनर्निर्देशित ।
  • फ्रंटएंड url में, यदि ग्राहक आईडी और login_keyएक विशिष्ट ग्राहक के लिए मेल खाता है तो मैं ग्राहक ऑब्जेक्ट को सत्र (जैसे लॉग इन) में सेट करता हूं और हटाता हूं, login_keyताकि यूआरएल भविष्य में काम न करे।

यह काम करने के लिए। मेरा मतलब है, मैं चयनित ग्राहक के रूप में लॉग इन करता हूं और ऑटोलॉगिन के लिए उपयोग किया जाने वाला लिंक दूसरी बार काम नहीं करता है।
नीचे की ओर यह है कि यदि 2 व्यवस्थापक उसी समय के आसपास "ऑटोलॉगिन" बटन पर क्लिक करते हैं, तो कोई लॉगिन करने में विफल रहेगा, लेकिन यह स्वीकार्य जोखिम है।
मेरी मुख्य चिंता यह है कि यह एक (नहीं भी) बड़ा सुरक्षा मुद्दा हो सकता है। क्या कोई इस दृष्टिकोण के साथ कुछ गलत देख सकता है? या एक बेहतर सुझाव है?
इस तथ्य पर ध्यान न दें कि ग्राहक खातों को वेबसाइट द्वारा अलग किया जा सकता है। यह महत्वपूर्ण नहीं है और इसे आसानी से प्रबंधित भी किया जा सकता है।


क्या नियमित रूप से व्यवस्थापक URL कुंजी आपको अधिक सुरक्षा नहीं देगी?
कलनजोरदान

@kalenjordan समस्या व्यवस्थापक भाग नहीं है। वह ठीक है। मेरी चिंता तब है जब ऑटोलोगिन के लिए फ्रंटएंड URL पर कॉल करना। मैं वहां व्यवस्थापक URL कुंजी का उपयोग नहीं कर सकता।
मेरियस

आह ठीक है, क्षमा करें। क्या आपने magentocommerce.com/magento-connect/login-as-customer-9893.html चेक किया है ? यह व्यवस्थापक द्वारा लॉगिन प्रति प्रयास का एक अनूठा रिकॉर्ड बनाता है, जिसमें ग्राहक आईडी से जुड़ा एक अनूठा हैश होता है जो फ्रंटएंड कंट्रोलर में उपयोग किया जाता है।
कालेंजर्डन

@ एकलेंजर्दन हा हा। मैं उस विस्तार के बारे में नहीं जानता था। लेकिन आपने जो वर्णन किया है, वही दृष्टिकोण मैंने प्रश्न में वर्णित किया है। :)। मैं इस पर एक नज़र डालूँगा। धन्यवाद।
मेरियस

1
@ mageUz.True, लेकिन जैसा मैंने कहा, यह स्वीकार्य जोखिम है। मैं यहां सुरक्षा से ज्यादा चिंतित हूं।
मेरियस

जवाबों:


9

के बाद से कोई भी एक अच्छा कारण के साथ नहीं आया था कि मैं क्या पूछ रहा था मुझे लगता है कि मेरी विधि सुरक्षित है की तरह है। इसलिए, इस प्रश्न को खुला नहीं छोड़ने के लिए, मैंने एक उत्तर के रूप में कोड को जोड़ने और इसे स्वीकार किए जाने के रूप में चिह्नित करने का निर्णय लिया।
तो मेरे पास एक नई एक्सटेंशन है जिसे Easylife_Simulateनिम्नलिखित फ़ाइलों के साथ बुलाया गया है: app/etc/modules/Easylife_Simulte.xml- घोषणा फ़ाइल:

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Simulate>
            <codePool>local</codePool>
            <active>true</active>
            <depends>
                <Mage_Customer />
            </depends>
        </Easylife_Simulate>
    </modules>
</config>

app/code/local/Easylife/Simulte/etc/config.xml - कॉन्फ़िगरेशन फ़ाइल

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Simulate>
            <version>0.0.1</version>
        </Easylife_Simulate>
    </modules>
    <global>
        <helpers>
            <easylife_simulate>
                <class>Easylife_Simulate_Helper</class>
            </easylife_simulate>
        </helpers>
        <models>
            <easylife_simulate>
                <class>Easylife_Simulate_Model</class>
            </easylife_simulate>
        </models>
        <resources>
            <easylife_simulate_setup>
                <setup>
                    <module>Easylife_Simulate</module>
                    <class>Mage_Customer_Model_Resource_Setup</class>
                </setup>
            </easylife_simulate_setup>
        </resources>
    </global>
    <frontend>
        <routers>
            <easylife_simulate>
                <use>standard</use>
                <args>
                    <module>Easylife_Simulate</module>
                    <frontName>simulate</frontName>
                </args>
            </easylife_simulate>
        </routers>
    </frontend>
    <adminhtml>
        <events>
            <controller_action_layout_render_before_adminhtml_customer_edit>
                <observers>
                    <easylife_simulate>
                        <class>easylife_simulate/observer</class>
                        <method>addAutoLoginButton</method>
                    </easylife_simulate>
                </observers>
            </controller_action_layout_render_before_adminhtml_customer_edit>
        </events>
    </adminhtml>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Easylife_Simulate before="Mage_Adminhtml">Easylife_Simulate_Adminhtml</Easylife_Simulate>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

app/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php - स्क्रिप्ट स्थापित करें - एक नई ग्राहक विशेषता जोड़ता है:

<?php
$this->addAttribute('customer', 'login_key', array(
    'type'      => 'text',
    'label'     => 'Auto login key',
    'input'     => 'text',
    'position'  => 999,
    'required'  => false
));

app/code/local/Easylife/Simulate/Model/Observer.php - ग्राहक व्यवस्थापक संपादित फ़ॉर्म में एक बटन जोड़ने के लिए पर्यवेक्षक

<?php
class Easylife_Simulate_Model_Observer extends Mage_ProductAlert_Model_Observer{
    public function addAutoLoginButton($observer){
        $block = Mage::app()->getLayout()->getBlock('customer_edit');
        if ($block){
            $customer = Mage::registry('current_customer');
            $block->addButton('login', array(
                'label'     => Mage::helper('customer')->__('Login as this customer'),
                'onclick'   => 'window.open(\''.Mage::helper('adminhtml')->getUrl('adminhtml/simulate/login', array('id'=>$customer->getId())).'\')',
            ), 100);
        }

    }
}

app/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php - व्यवस्थापक नियंत्रक जो ऊपर उत्पन्न बटन पर क्लिक को संभालता है।

<?php
class Easylife_Simulate_Adminhtml_SimulateController extends Mage_Adminhtml_Controller_Action{
    public function loginAction(){
        $id = $this->getRequest()->getParam('id');
        $customer = Mage::getModel('customer/customer')->load($id);
        if (!$customer->getId()){
            Mage::getSingleton('adminhtml/session')->addError(Mage::helper('easylife_simulate')->__('Customer does not exist'));
            $this->_redirectReferer();
        }
        else {
            $key = Mage::helper('core')->uniqHash();
            $customer->setLoginKey($key)->save();
            $this->_redirect('simulate/index/index', array('id'=>$customer->getId(), 'login_key'=>$key));
        }
    }
}

app/code/local/Easylife/Simulate/controllers/IndexController.php - फ्रंटलाइन कंट्रोलर जो ऑटोलॉगिन बनाता है।

<?php
class Easylife_Simulate_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        $id = $this->getRequest()->getParam('id');
        $key = $this->getRequest()->getParam('login_key');
        if (empty($key)){
            $this->_redirect('');
        }
        else{
            $customer = Mage::getModel('customer/customer')->load($id);
            if ($customer->getId() && $customer->getLoginKey() == $key){
                $customer->setLoginKey('')->save();
                Mage::getSingleton('customer/session')->setCustomerAsLoggedIn($customer);
                Mage::getSingleton('customer/session')->renewSession();
            }
            $this->_redirect('customer/account/index');
        }
    }
}

app/code/local/Easylife/Simulte/Helper/Data.php - मॉड्यूल सहायक

<?php
class Easylife_Simulate_Helper_Data extends Mage_Core_Helper_Abstract{

}

बस। यह मेरे लिए काम करता है। जैसा कि मैंने सवाल में कहा, नकारात्मक पक्ष यह है कि यदि 2 व्यवस्थापक उसी समय (लगभग) एक ही ग्राहक के लिए लॉगिन बटन दबाते हैं, तो उनमें से एक लॉग इन नहीं किया जाएगा। लेकिन वह कुछ सेकंड बाद प्रक्रिया को दोहरा सकता है।


एकाधिक ग्राहक होने पर क्या होता है?
मिलोपले इंक

@GarthHuff मुझे आपका सवाल समझ नहीं आ रहा है। कृपया अपने परिदृश्य का वर्णन करें।
मेरियस

मुझे लगता है, मैंने जो भी किया है उससे पूरा परिदृश्य बदल गया है उपयोगकर्ता नाम इनपुट बॉक्स को ड्रॉप-डाउन के साथ संभव उपयोगकर्ता नाम से बदलें और उपयोगकर्ता नाम ड्रॉपडाउन से चयनित होने पर स्वचालित रूप से लॉगिन करें। यह मेरा निहितार्थ है Techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff। स्क्रिप्ट के लिए धन्यवाद, लेकिन मेरी समस्या ग्राहकों से संबंधित है, न कि प्रशंसा।
मेरियस

@ क्या आप इसके एक Magento के 2 संस्करण बनाने की योजना बना रहे हैं?
दान

0

हम अपने ग्राहक सेवा दल के लिए एक समान दृष्टिकोण का उपयोग करते हैं जिसे "घोस्ट लॉगिन" कहा जाता है जहां हम व्यवस्थापक में ग्राहक खाते के माध्यम से एक बटन उपलब्ध कराते हैं। हम login_key या उसके जैसी किसी भी कस्टम विशेषता का उपयोग नहीं कर रहे हैं और वास्तव में लॉगिन को संसाधित करने के लिए Mage_Customer_AccountController से विस्तारित ओवरराइड / अनुकूलित लॉगिन का उपयोग कर रहे हैं।

इसके अतिरिक्त, लॉगिनएक्शन के दौरान, हमारे कस्टम तर्क और सत्यापन के बाद, हम यह सुनिश्चित करने के लिए Mage_Customer_Model_Session :: setCustomerAsLoggedIn का उपयोग कर रहे हैं कि हम लॉगिन के दौरान निष्पादित होने वाली किसी भी कार्यक्षमता पर नहीं चूक रहे हैं। यदि आप इस पद्धति पर एक नज़र डालते हैं, तो आप देखेंगे कि यह ग्राहक को सत्र में सेट करता है और साथ ही customer_login इवेंट को भेजता है।

यहाँ छवि विवरण दर्ज करें

इस दृष्टिकोण के साथ हम वास्तव में कई एजेंटों को लॉग इन कर सकते हैं क्योंकि उसी ग्राहक को हमें चुनना चाहिए (हालांकि हम एक ही समय में एक ही समय में कई एजेंटों को कार्ट में जोड़ना / ऑर्डर देना नहीं चाहेंगे)।

हम दो वर्षों से इसका उपयोग कर रहे हैं, उस समय के दौरान कोई उल्लेखनीय मुद्दा नहीं है।


1
जानकारी के लिए धन्यवाद। मैं setCustomerAsLoggedInअपने कोड में भी उपयोग करता हूं, उसी कारण से जैसे आप करते हैं। लेकिन मैं ऑटोलॉगिन के लिए उपयोग करने की विधि के लिए उत्सुक था। (अगर यह एक रहस्य नहीं है)।
मेरियस

हमने इसे संभालने के लिए एक कस्टम मॉड्यूल बनाया है जो कोर फ्रंटएंड लॉगिन कार्यक्षमता से फैला है।
एंथनी लीच जूनियर

मैं समझ गया। मैं कुछ कोड के बारे में पूछ रहा था, यदि संभव हो, या कम से कम कोड के पीछे का विचार। या शायद कुछ संकेत अगर मेरा विचार सुरक्षित है या नहीं।
मेरियस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.