Autologin su frontend dal backend


15

Vedi il seguente scenario.
Ho un modulo personalizzato che consente all'utente frontend di eseguire alcune azioni su alcune entità personalizzate. (i dettagli non sono molto importanti).
La richiesta è che un amministratore dovrebbe essere in grado di accedere al frontend con l'account del cliente (senza avere la password) ed essere in grado di eseguire tali azioni per il cliente.
Dal momento che non è possibile utilizzare la sessione front-end dal back-end e non voglio creare un collegamento di accesso automatico permanente per il front-end poiché potrebbe essere un grosso problema di sicurezza, questo è quello che ho fatto finora.

  • aggiungere un attributo vuoto per l'entità cliente. (chiamiamolo login_key)
  • aggiungere un pulsante nel back-end nella pagina di modifica del cliente che reindirizza a una pagina di amministrazione in cui viene generata e salvata una stringa casuale nell'attributo login_key.
  • nella stessa azione reindirizzo l'amministratore a un URL frontend come questo autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(valore generato nel passaggio precedente).
  • nell'URL frontend, se l'ID cliente e la login_keycorrispondenza per un cliente specifico, ho impostato l'oggetto cliente in sessione (come effettuato l'accesso) ed elimino in login_keymodo che l'URL non funzionerà in futuro.

Questo giunge al lavoro. Voglio dire, ottengo l'accesso come cliente selezionato e il collegamento utilizzato per l'autologin non funziona una seconda volta.
Il rovescio della medaglia è che se 2 amministratori fanno clic sul pulsante "autologin" nello stesso momento, non si potrà accedere, ma questo è un rischio accettabile.
La mia principale preoccupazione è che questo potrebbe anche essere un (non quello) grande problema di sicurezza. Qualcuno può vedere qualcosa di sbagliato in questo approccio? o suggerire uno migliore?
Ignora il fatto che gli account dei clienti possono essere separati dal sito Web. Questo non è importante e può anche essere gestito facilmente.


Le normali chiavi URL dell'amministratore non ti darebbero la stessa sicurezza?
Kalenjordan,

@kalenjordan Il problema non è la parte admin. Questo va bene. La mia preoccupazione è quando si chiama l'URL di frontend per l'autologin. Non riesco a usare le chiavi dell'URL dell'amministratore lì dentro.
Marius

Ah giusto, scusa. Hai controllato magentocommerce.com/magento-connect/login-as-customer-9893.html ? Genera un record univoco per tentativo di accesso da parte dell'amministratore, con un hash univoco associato all'ID cliente utilizzato nel controller frontend.
Kalenjordan,

@kalenjordan Ha Ha. Non sapevo di quell'estensione. ma da quello che hai descritto è lo stesso approccio che ho descritto nella domanda. :). Ci darò un'occhiata. Grazie.
Marius

1
@ mageUz.True, ma come ho detto, è un rischio accettabile. Sono più preoccupato per la sicurezza qui.
Marius

Risposte:


9

Dal momento che nessuno ha trovato una buona ragione per non fare quello che stavo chiedendo, presumo che il mio metodo sia piuttosto sicuro. Quindi, per non lasciare aperta questa domanda, ho deciso di aggiungere il codice come risposta e di contrassegnarlo come accettato.
Quindi ho una nuova estensione chiamata Easylife_Simulatecon i seguenti file: app/etc/modules/Easylife_Simulte.xml- il file di dichiarazione:

<?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 - il file di configurazione

<?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 - installa script: aggiunge un nuovo attributo del cliente:

<?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 - osservatore per aggiungere un pulsante nel modulo di modifica dell'amministratore del cliente

<?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 - il controller di amministrazione che gestisce il clic sul pulsante generato sopra.

<?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 - il controller frontend che esegue l'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 - l'helper del modulo

<?php
class Easylife_Simulate_Helper_Data extends Mage_Core_Helper_Abstract{

}

Questo è tutto. Sembra funzionare per me. Come ho detto nella domanda, il rovescio della medaglia è che se 2 amministratori premono il pulsante di accesso per lo stesso cliente (approssimativamente) nello stesso momento, uno di loro non sarà loggato. Ma può ripetere il processo qualche secondo dopo.


Cosa succede quando ci sono più clienti?
Milople Inc,

@GarthHuff Non capisco la tua domanda. Descrivi il tuo scenario.
Marius

penso, ho cambiato l'intero scenario quello che ho fatto è Sostituire la casella di input del nome utente con il menu a discesa con il possibile nome utente e accedere automaticamente quando il nome utente selezionato dal menu a discesa. Questa è la mia tecnica techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc,

@GarthHuff. Grazie per la sceneggiatura, ma il mio problema è legato ai clienti frontend, non agli amministratori.
Marius

@Marius pensi di fare una versione di Magento 2 di questo?
Dan,

0

Usiamo un approccio simile per il nostro servizio clienti chiamato "ghost login" in cui rendiamo disponibile un pulsante tramite account cliente in admin. Non stiamo usando alcun attributo personalizzato per login_key o qualcosa del genere e in realtà stiamo usando un login sovrascritto / personalizzato esteso da Mage_Customer_AccountController per elaborare il login.

Inoltre, durante loginAction, dopo la nostra logica e convalida personalizzate, stiamo usando Mage_Customer_Model_Session :: setCustomerAsLoggedIn per assicurarci di non perdere alcuna funzionalità di evento che può essere eseguita durante l'accesso. Se dai un'occhiata a questo metodo, noterai che imposta il cliente nella sessione e invia l'evento customer_login.

inserisci qui la descrizione dell'immagine

Con questo approccio possiamo effettivamente avere più agenti che accedono come lo stesso cliente dovremmo scegliere (anche se non vorremmo avere più agenti che si aggiungono al carrello / effettuano ordini contemporaneamente sullo stesso account).

Lo usiamo da due anni ormai senza problemi rilevanti durante quel periodo.


1
Grazie per le informazioni. Uso anche il setCustomerAsLoggedInmio codice, per lo stesso motivo per cui lo fai. Ma ero curioso del metodo da utilizzare per l'autologin. (se non è un segreto).
Marius

Abbiamo creato un modulo personalizzato per gestire ciò che si estende dalla funzionalità di accesso frontend principale.
Anthony Leach Jr

Ho capito. Stavo chiedendo del codice, se possibile, o almeno l'idea alla base del codice. O forse alcuni suggerimenti se la mia idea è sicura o no.
Marius
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.