Como a nadie se le ocurrió una buena razón para no hacer lo que le estaba pidiendo, asumo que mi método es seguro. Entonces, para no dejar esta pregunta abierta, decidí agregar el código como respuesta y marcarlo como aceptado.
Entonces tengo una nueva extensión llamada Easylife_Simulate
con los siguientes archivos:
app/etc/modules/Easylife_Simulte.xml
- el archivo de declaración:
<?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
- el archivo de configuración
<?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
- instalar script: agrega un nuevo atributo de 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
- observador para agregar un botón en el formulario de edición de administración 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
- el controlador de administrador que maneja el clic en el botón generado anteriormente.
<?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
- El controlador frontend que hace el inicio de sesión automático.
<?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
- el ayudante del módulo
<?php
class Easylife_Simulate_Helper_Data extends Mage_Core_Helper_Abstract{
}
Eso es. Parece que funciona para mí. Como dije en la pregunta, la desventaja es que si 2 administradores presionan el botón de inicio de sesión para el mismo cliente aproximadamente (al mismo tiempo), uno de ellos no se registrará. Pero puede repetir el proceso unos segundos más tarde.