Veja o seguinte cenário.
Eu tenho algum módulo personalizado que permite ao usuário front-end executar algumas ações em algumas entidades personalizadas. (os detalhes não são realmente importantes).
A solicitação é de que um administrador possa efetuar login no front-end com a conta do cliente (sem ter a senha) e poder executar essas ações para o cliente.
Como você não pode usar a sessão de front-end do back-end e não quero criar um link permanente de logon automático para o front-end, pois pode haver um grande problema de segurança, foi o que fiz até agora.
- adicione um atributo vazio para a entidade do cliente. (vamos chamá-lo
login_key
) - adicione um botão no back-end na página de edição do cliente que redireciona para uma página de administrador em que uma sequência aleatória é gerada e salva no atributo
login_key
. - na mesma ação, redireciono o administrador para um URL de front-end como este
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(valor gerado na etapa anterior). - no URL do front-end, se o ID do cliente
login_key
corresponder a um cliente específico, defino o objeto do cliente na sessão (como conectado) e excluo ologin_key
para que o URL não funcione no futuro.
Isso parece funcionar. Quero dizer, eu entrei como cliente selecionado e o link usado para o logon automático não funciona uma segunda vez.
O lado negativo é que, se 2 administradores clicarem no botão "login automático" ao mesmo tempo, um falhará no login, mas este é um risco aceitável.
Minha principal preocupação é que esse também possa ser um grande problema de segurança. Alguém pode ver algo errado com essa abordagem? ou sugerir um melhor?
Ignore o fato de que as contas dos clientes podem ser separadas por site. Isso não é importante e também pode ser gerenciado facilmente.
Respostas:
Como ninguém apresentou uma boa razão para não fazer o que eu estava pedindo, presumo que meu método seja meio seguro. Portanto, para não deixar essa pergunta em aberto, decidi adicionar o código como resposta e marcá-lo como aceito.
Então, eu tenho uma nova extensão chamada
Easylife_Simulate
com os seguintes arquivos:app/etc/modules/Easylife_Simulte.xml
- o arquivo de declaração:app/code/local/Easylife/Simulte/etc/config.xml
- o arquivo de configuraçãoapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- script de instalação - adiciona um novo atributo de cliente:app/code/local/Easylife/Simulate/Model/Observer.php
- observador para adicionar um botão no formulário de edição do administrador do clienteapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- o controlador administrativo que lida com o clique no botão gerado acima.app/code/local/Easylife/Simulate/controllers/IndexController.php
- o controlador front-end que faz o logon automático.app/code/local/Easylife/Simulte/Helper/Data.php
- o auxiliar do móduloÉ isso aí. Parece trabalhar para mim. Como eu disse na pergunta, a desvantagem é que, se 2 administradores pressionarem o botão de login do mesmo cliente (aproximadamente) ao mesmo tempo, um deles não será logado. Mas ele pode repetir o processo alguns segundos depois.
fonte
Usamos uma abordagem semelhante para nossa equipe de atendimento ao cliente chamada "login fantasma", onde disponibilizamos um botão via conta de cliente em admin. Não estamos usando nenhum atributo personalizado para login_key ou algo parecido e, na verdade, estamos usando uma ação de login substituída / personalizada estendida de Mage_Customer_AccountController para processar o login.
Além disso, durante o loginAction, após nossa lógica e validação personalizadas, estamos usando Mage_Customer_Model_Session :: setCustomerAsLoggedIn para garantir que não estamos perdendo nenhuma funcionalidade de evento que possa ser executada durante o login. Se você der uma olhada nesse método, notará que ele define o cliente na sessão e despacha o evento customer_login.
Com essa abordagem, podemos realmente fazer com que vários agentes façam login como o mesmo cliente que devemos escolher (embora não desejemos que vários agentes sejam adicionados ao carrinho / fazendo pedidos ao mesmo tempo na mesma conta).
Estamos usando isso há dois anos, sem problemas notáveis durante esse período.
fonte
setCustomerAsLoggedIn
no meu código, pelo mesmo motivo que você. Mas eu estava curioso sobre o método a ser usado para o login automático. (se não é um segredo).