Автологічний вхід на фронтменті з бекенда


15

Дивіться наступний сценарій.
У мене є спеціальний модуль, який дозволяє користувачу інтерфейсу виконувати деякі дії над деякими спеціальними об'єктами. (деталі не дуже важливі).
Запит полягає в тому, що адміністратор повинен мати можливість увійти за кордон з обліковим записом клієнта (не маючи пароля) та бути в змозі виконувати ці дії для клієнта.
Оскільки ви не можете використовувати сеанс frontend з бекенда, і я не хочу створювати постійне посилання для автологічного входу для frontend, оскільки це може бути великим отвором у безпеці, це я зробив досі.

  • додати порожній атрибут для суб'єкта клієнта. (назвемо це login_key)
  • додайте кнопку в бекенде на сторінці редагування клієнта, яка перенаправляє на сторінку адміністратора, де генерується випадкова рядок і зберігається в атрибуті login_key.
  • у тій же дії я переадресовую адміністратора на URL-адресу фронта, як це autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(значення, сформоване на попередньому кроці).
  • у URL-адресі фронту, якщо ідентифікатор клієнта та login_keyзбігаються з конкретним клієнтом, то я встановлюю об’єкт клієнта під час сеансу (як увійшов) та видаляю, login_keyщоб URL-адреса не працювала в майбутньому.

Це шви для роботи. Я маю на увазі, я входжу як зареєстрований клієнт, і посилання, яке використовується для автологічного входу, не працює вдруге.
Нижня сторона полягає в тому, що якщо два адміністратори натискають кнопку "автологічного входу" приблизно в той же час, один не зможе ввійти, але це прийнятний ризик.
Моє основне занепокоєння полягає в тому, що це також може бути великим питанням безпеки. Чи може хтось бачити щось не так у цьому підході? або запропонувати кращу?
Ігноруйте той факт, що облікові записи клієнтів можна розділити на веб-сайті. Це не важливо, а також ним можна легко керувати.


Чи не звичайні ключові адреси адміністратора не надають вам стільки ж безпеки?
kalenjordan

@kalenjordan Проблема не в частині адміністратора. Це шви гаразд. Моє занепокоєння викликає виклик URL-адреси для автоматичного входу. Я не можу там використовувати ключові адреси адміністратора.
Маріус

Ага, вибачте. Ви перевірили magentocommerce.com/magento-connect/login-as-customer-9893.html ? Він генерує унікальний запис за спробу входу адміністратором, з унікальним хешем, асоційованим з ідентифікатором клієнта, який використовується в контролері інтерфейсу.
kalenjordan

@kalenjordan Ha Ha. Я не знав про це розширення. але з того, що ви описали, це той самий підхід, який я описав у питанні. :). Я погляну на це. Спасибі.
Маріус

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{

}

Це воно. Це, здається, працює для мене. Як я вже говорив у питанні, недоліком є ​​те, що якщо два адміністратори натискають кнопку входу для того самого клієнта (приблизно) в один і той же час, один з них не буде входити в систему. Але він може повторити процес через кілька секунд.


Що відбувається, коли є кілька клієнтів?
Milople Inc

@GarthHuff Я не розумію твого питання. Опишіть, будь ласка, свій сценарій.
Маріус

я думаю, я змінив весь сценарій, що я зробив, це замінити поле введення імені користувача на спадне меню можливим іменем користувача та ввійти автоматично, коли ім'я користувача вибрано зі спадного меню. Це мій прихисток techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff. Дякую за сценарій, але моя проблема пов’язана з клієнтами, що працюють в інтернеті, а не адміністраторами.
Маріус

@Marius ви плануєте зробити Magento 2 версії цього?
Дан

0

Ми використовуємо аналогічний підхід для нашої команди з обслуговування клієнтів під назвою "вхід в привид", де ми робимо кнопку доступною через обліковий запис клієнта в адміністраторі. Ми не використовуємо жодних спеціальних атрибутів для входу_кей або щось подібне, і фактично використовуємо переосмислений / налаштований вхідАкція, розширену від Mage_Customer_AccountController для обробки входу.

Крім того, під час loginAction, після нашої власної логіки та перевірки, ми використовуємо Mage_Customer_Model_Session :: setCustomerAsLoggedIn для того, щоб ми не втратили жодних функцій подій, які можуть бути виконані під час входу. Якщо ви подивитесь на цей метод, ви помітите, що він встановлює клієнта під час сеансу, а також розсилає подію customer_login.

введіть тут опис зображення

При такому підході ми можемо фактично мати декілька агентів увійти, оскільки той самий клієнт повинен вибрати (хоча ми не хотіли б, щоб кілька агентів додавали до кошика / розміщення замовлень одночасно на одному рахунку).

Ми використовуємо це вже два роки, не маючи помітних проблем у той час.


1
Дякую за інформацію. Я також використовую setCustomerAsLoggedInв своєму коді з тієї ж причини, що і ви. Але мені було цікаво метод використовувати для аутологіну. (якщо це не секрет).
Маріус

Ми створили спеціальний модуль для вирішення цього питання, який поширюється на функціональну функцію входу в основні інтерфейси.
Ентоні Ліч-молодший

Я це зрозумів. Я запитував про якийсь код, якщо це можливо, або принаймні ідею за кодом. А може, деякі покажчики, якщо моя ідея є безпечною чи ні.
Маріус
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.