Vea el siguiente escenario.
Tengo un módulo personalizado que permite al usuario frontend realizar algunas acciones en algunas entidades personalizadas. (Los detalles no son realmente importantes).
La solicitud es que un administrador pueda iniciar sesión en la interfaz con la cuenta del cliente (sin tener la contraseña) y poder realizar esas acciones para el cliente.
Dado que no puede usar la sesión de interfaz desde el backend y no quiero crear un enlace de inicio de sesión permanente para frontend ya que podría ser un gran agujero de seguridad, esto es lo que hice hasta ahora.
- agregue un atributo vacío para la entidad del cliente. (vamos a llamarlo
login_key
) - agregue un botón en el backend en la página de edición del cliente que redirige a una página de administración donde se genera una cadena aleatoria y se guarda en el atributo
login_key
. - En la misma acción, redirijo al administrador a una URL de interfaz como esta
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(valor generado en el paso anterior). - en la URL de la interfaz, si la identificación del cliente y la
login_key
coincidencia para un cliente específico, configuro el objeto del cliente en la sesión (como conectado) y eliminologin_key
la URL para que la URL no funcione en el futuro.
Esto parece funcionar. Es decir, me conecto como el cliente seleccionado y el enlace utilizado para el inicio de sesión automático no funciona por segunda vez.
La desventaja es que si 2 administradores hacen clic en el botón "autologin" al mismo tiempo, uno no podrá iniciar sesión, pero este es un riesgo aceptable.
Mi principal preocupación es que esto también puede ser un (no ese) gran problema de seguridad. ¿Alguien puede ver algo mal con este enfoque? o sugerir una mejor?
Ignore el hecho de que las cuentas de los clientes pueden estar separadas por el sitio web. Esto no es importante y también se puede gestionar fácilmente.
Respuestas:
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:app/code/local/Easylife/Simulte/etc/config.xml
- el archivo de configuraciónapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- instalar script: agrega un nuevo atributo de cliente:app/code/local/Easylife/Simulate/Model/Observer.php
- observador para agregar un botón en el formulario de edición de administración del clienteapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- el controlador de administrador que maneja el clic en el botón generado anteriormente.app/code/local/Easylife/Simulate/controllers/IndexController.php
- El controlador frontend que hace el inicio de sesión automático.app/code/local/Easylife/Simulte/Helper/Data.php
- el ayudante del móduloEso 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.
fuente
Utilizamos un enfoque similar para nuestro equipo de servicio al cliente llamado "inicio de sesión fantasma", donde ponemos a disposición un botón a través de la cuenta del cliente en admin. No estamos utilizando ningún atributo personalizado para login_key ni nada por el estilo y en realidad estamos utilizando una loginAction anulada / personalizada extendida desde Mage_Customer_AccountController para procesar el inicio de sesión.
Además, durante loginAction, después de nuestra lógica y validación personalizadas, estamos utilizando Mage_Customer_Model_Session :: setCustomerAsLoggedIn para garantizar que no perdamos ninguna funcionalidad de evento que pueda ejecutarse durante el inicio de sesión. Si observa este método, notará que establece al cliente en la sesión y envía el evento customer_login.
Con este enfoque, podemos hacer que varios agentes inicien sesión como el mismo cliente si así lo decidiéramos (aunque no quisiéramos que múltiples agentes agreguen al carrito / realicen pedidos al mismo tiempo en la misma cuenta).
Hemos estado usando esto durante dos años sin problemas notables durante ese tiempo.
fuente
setCustomerAsLoggedIn
en mi código, por la misma razón que tú. Pero tenía curiosidad sobre el método a utilizar para el inicio de sesión automático. (Si no es un secreto).