Autologin บน frontend จาก backend


15

ดูสถานการณ์สมมติต่อไปนี้
ฉันมีโมดูลที่กำหนดเองที่อนุญาตให้ผู้ใช้ส่วนหน้าดำเนินการบางอย่างกับเอนทิตีที่กำหนดเองบางอย่าง (รายละเอียดไม่สำคัญจริงๆ)
คำขอคือผู้ดูแลระบบควรสามารถเข้าสู่ระบบในส่วนหน้าด้วยบัญชีลูกค้า (โดยไม่ต้องมีรหัสผ่าน) และสามารถดำเนินการเหล่านั้นให้กับลูกค้าได้
เนื่องจากคุณไม่สามารถใช้เซสชั่นส่วนหน้าจากแบ็กเอนด์และฉันไม่ต้องการที่จะสร้างลิงค์อัตโนมัติสำหรับส่วนหน้าเนื่องจากอาจเป็นช่องโหว่ขนาดใหญ่นี่คือสิ่งที่ฉันทำมาจนถึงตอนนี้

  • เพิ่มแอตทริบิวต์ว่างสำหรับเอนทิตีลูกค้า (เรียกมันว่าlogin_key)
  • เพิ่มปุ่มในแบ็กเอนด์บนหน้าแก้ไขลูกค้าว่าการเปลี่ยนเส้นทางไปยังผู้ดูแลระบบlogin_keyหน้าเว็บที่สตริงสุ่มถูกสร้างขึ้นและบันทึกไว้ในแอตทริบิวต์
  • ในการดำเนินการเดียวกันฉันเปลี่ยนเส้นทางผู้ดูแลระบบไปยัง URL ส่วนหน้าเช่นนี้autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(ค่าที่สร้างขึ้นในขั้นตอนก่อนหน้า)
  • ที่ส่วนหน้าของ url หากรหัสลูกค้าและlogin_keyตรงกับลูกค้าที่เฉพาะเจาะจงแล้วฉันจะตั้งวัตถุลูกค้าในเซสชั่น (เป็นเข้าสู่ระบบ) และลบlogin_keyดังนั้น URL จะไม่ทำงานในอนาคต

ตะเข็บนี้ใช้งานได้ ฉันหมายถึงฉันเข้าสู่ระบบในฐานะลูกค้าที่เลือกและลิงค์ที่ใช้สำหรับออโตโลจินไม่ทำงานเป็นครั้งที่สอง
ข้อเสียคือถ้าผู้ดูแลระบบ 2 คนคลิกที่ปุ่ม "autologin" ในเวลาเดียวกันคนหนึ่งจะล้มเหลวในการเข้าสู่ระบบ แต่นี่เป็นความเสี่ยงที่ยอมรับได้
ความกังวลหลักของฉันคือว่านี่อาจเป็นปัญหาความปลอดภัยขนาดใหญ่ (ไม่ใช่ว่า) บางคนเห็นสิ่งผิดปกติในแนวทางนี้หรือไม่? หรือแนะนำที่ดีกว่า
ไม่สนใจข้อเท็จจริงที่ว่าบัญชีลูกค้าสามารถแยกได้จากเว็บไซต์ สิ่งนี้ไม่สำคัญและยังสามารถจัดการได้อย่างง่ายดาย


คีย์ URL ของผู้ดูแลระบบทั่วไปจะไม่ให้ความปลอดภัยเท่ากันหรือไม่
kalenjordan

@kalenjordan ปัญหาไม่ใช่ส่วนของผู้ดูแลระบบ ตะเข็บนั้นตกลง ความกังวลของฉันคือเมื่อเรียก URL ส่วนหน้าสำหรับ autologin ฉันไม่สามารถใช้กุญแจ URL ของผู้ดูแลระบบได้
Marius

อ่าขอโทษด้วย คุณลองดูmagentocommerce.com/magento-connect/login-as-customer-9893.htmlไหม มันสร้างบันทึกที่ไม่ซ้ำกันต่อการพยายามเข้าสู่ระบบโดยผู้ดูแลระบบที่มีแฮชที่ไม่ซ้ำกันที่เกี่ยวข้องกับรหัสลูกค้าที่ใช้ในการควบคุมส่วนหน้า
kalenjordan

@kalenjordan ฮาฮา ฉันไม่รู้เกี่ยวกับส่วนขยายนั้น แต่จากสิ่งที่คุณอธิบายเป็นวิธีเดียวกับที่ฉันอธิบายไว้ในคำถาม :) ฉันจะดูมัน ขอบคุณ
Marius

1
@ mageUz.True แต่อย่างที่ฉันพูดนั่นเป็นความเสี่ยงที่ยอมรับได้ ฉันกังวลเรื่องความปลอดภัยมากกว่าที่นี่
Marius

คำตอบ:


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 - ตัวควบคุมส่วนหน้าที่ทำให้ autologin

<?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 ผู้ดูแลระบบกดปุ่มล็อกอินสำหรับลูกค้าคนเดียวกันที่ (โดยประมาณ) ในเวลาเดียวกันหนึ่งในนั้นจะไม่ได้เข้าสู่ระบบ แต่เขาสามารถทำซ้ำกระบวนการในไม่กี่วินาทีต่อมา


เกิดอะไรขึ้นเมื่อมีลูกค้าหลายราย
Milople Inc

@GarthHuff ฉันไม่เข้าใจคำถามของคุณ โปรดอธิบายสถานการณ์ของคุณ
Marius

ฉันคิดว่าฉันมีการเปลี่ยนแปลงสถานการณ์ทั้งหมดที่ฉันทำคือแทนที่กล่องใส่ชื่อผู้ใช้ด้วยรายการแบบหล่นลงด้วยชื่อผู้ใช้ที่เป็นไปได้และเข้าสู่ระบบโดยอัตโนมัติเมื่อเลือกชื่อผู้ใช้จากแบบเลื่อนลง นี้เป็นของฉัน implmentation techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff ขอบคุณสำหรับสคริปต์ แต่ปัญหาของฉันเกี่ยวข้องกับลูกค้าส่วนหน้าไม่ใช่ผู้ดูแลระบบ
Marius

@Marius คุณวางแผนที่จะทำ Magento 2 เวอร์ชั่นนี้หรือไม่?
ด่าน

0

เราใช้วิธีการที่คล้ายกันสำหรับทีมบริการลูกค้าของเราที่เรียกว่า "การเข้าสู่ระบบผี" ซึ่งเราทำให้ปุ่มสามารถใช้ได้ผ่านบัญชีลูกค้าในการดูแลระบบ เราไม่ได้ใช้คุณสมบัติที่กำหนดเองใด ๆ สำหรับ login_key หรืออะไรทำนองนั้นและจริง ๆ แล้วใช้ loginAction แทนที่ / กำหนดเองที่ขยายจาก Mage_Customer_AccountController เพื่อประมวลผลการเข้าสู่ระบบ

นอกจากนี้ในระหว่าง loginAction หลังจากตรรกะที่กำหนดเองและการตรวจสอบเรากำลังใช้ Mage_Customer_Model_Session :: setCustomerAsLoggedIn เพื่อให้แน่ใจว่าเราจะไม่สูญเสียฟังก์ชันการทำงานใด ๆ ที่อาจถูกเรียกใช้ระหว่างการเข้าสู่ระบบ หากคุณดูที่วิธีนี้คุณจะสังเกตเห็นว่ามันตั้งลูกค้าในเซสชั่นเช่นเดียวกับยื้อเหตุการณ์ customer_login

ป้อนคำอธิบายรูปภาพที่นี่

ด้วยวิธีการนี้เราสามารถมีตัวแทนหลายคนเข้าสู่ระบบตามที่ลูกค้ารายเดียวกันเราควรเลือก (แม้ว่าเราจะไม่ต้องการให้มีตัวแทนหลายคนเพิ่มลงในรถเข็น / วางคำสั่งซื้อในเวลาเดียวกันในบัญชีเดียวกัน)

เราได้ใช้สิ่งนี้เป็นเวลาสองปีแล้วโดยไม่มีปัญหาที่น่าสังเกตในช่วงเวลานั้น


1
ขอบคุณสำหรับข้อมูล. ฉันยังใช้setCustomerAsLoggedInในรหัสของฉันด้วยเหตุผลเดียวกับที่คุณทำ แต่ฉันอยากรู้วิธีการใช้สำหรับออโตโลจิน (ถ้าไม่ใช่ความลับ)
Marius

เราได้สร้างโมดูลที่กำหนดเองเพื่อจัดการสิ่งนี้ซึ่งขยายจากฟังก์ชั่นเข้าสู่ระบบหลักของส่วนหน้า
Anthony Leach Jr

ฉันเข้าใจ. ฉันถูกถามเกี่ยวกับรหัสถ้าเป็นไปได้หรืออย่างน้อยความคิดที่อยู่เบื้องหลังรหัส หรืออาจเป็นตัวชี้บางอย่างถ้าความคิดของฉันปลอดภัยหรือไม่
Marius
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.