Voir le scénario suivant.
J'ai un module personnalisé qui permet à l'utilisateur frontal d'effectuer certaines actions sur certaines entités personnalisées. (les détails ne sont pas vraiment importants).
La demande est qu'un administrateur doit pouvoir se connecter sur le frontend avec le compte client (sans avoir le mot de passe) et être capable d'effectuer ces actions pour le client.
Étant donné que vous ne pouvez pas utiliser la session frontend à partir du backend et que je ne veux pas créer de lien d'authentification automatique permanent pour le frontend car cela pourrait être un gros trou de sécurité, c'est ce que j'ai fait jusqu'à présent.
- ajoutez un attribut vide pour l'entité client. (appelons-le
login_key
) - ajoutez un bouton dans le backend sur la page d'édition du client qui redirige vers une page d' administration où une chaîne aléatoire est générée et enregistrée dans l'attribut
login_key
. - dans la même action, je redirige l'administrateur vers une URL frontend comme celle-ci
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(valeur générée à l'étape précédente). - à l'URL frontend, si l'ID client
login_key
correspond à un client spécifique, je mets l'objet client en session (comme connecté) et je le supprimelogin_key
pour que l'URL ne fonctionne plus à l'avenir.
Cela semble fonctionner. Je veux dire, je me connecte en tant que client sélectionné et le lien utilisé pour la connexion automatique ne fonctionne pas une deuxième fois.
L'inconvénient est que si 2 administrateurs cliquent sur le bouton "Autologin" à peu près en même temps, l'un ne parviendra pas à se connecter, mais c'est un risque acceptable.
Ma principale préoccupation est que cela peut également être un (pas que) gros problème de sécurité. Quelqu'un peut-il voir quelque chose de mal avec cette approche? ou suggérer un meilleur?
Ignorez le fait que les comptes clients peuvent être séparés par site Web. Ce n'est pas important et peut également être géré facilement.
Réponses:
Puisque personne n'a trouvé une bonne raison de ne pas faire ce que je demandais, je suppose que ma méthode est assez sûre. Donc, afin de ne pas laisser cette question ouverte, j'ai décidé d'ajouter le code comme réponse et de le marquer comme accepté.
J'ai donc une nouvelle extension appelée
Easylife_Simulate
avec les fichiers suivants:app/etc/modules/Easylife_Simulte.xml
- le fichier de déclaration:app/code/local/Easylife/Simulte/etc/config.xml
- le fichier de configurationapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- script d'installation - ajoute un nouvel attribut client:app/code/local/Easylife/Simulate/Model/Observer.php
- observateur pour ajouter un bouton dans le formulaire de modification de l'administrateur clientapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- le contrôleur d'administration qui gère le clic sur le bouton généré ci-dessus.app/code/local/Easylife/Simulate/controllers/IndexController.php
- le contrôleur frontal qui fait l'autologin.app/code/local/Easylife/Simulte/Helper/Data.php
- l'aide au moduleC'est ça. Cela semble fonctionner pour moi. Comme je l'ai dit dans la question, l'inconvénient est que si 2 administrateurs appuient sur le bouton de connexion pour le même client en même temps (environ), l'un d'eux ne sera pas connecté. Mais il peut répéter le processus quelques secondes plus tard.
la source
Nous utilisons une approche similaire pour notre équipe de service client appelée "connexion fantôme" où nous mettons à disposition un bouton via le compte client dans l'admin. Nous n'utilisons aucun attribut personnalisé pour login_key ou quelque chose comme ça et utilisons en fait une loginAction remplacée / personnalisée étendue à partir de Mage_Customer_AccountController pour traiter la connexion.
De plus, pendant loginAction, après notre logique et validation personnalisées, nous utilisons Mage_Customer_Model_Session :: setCustomerAsLoggedIn pour nous assurer que nous ne perdons aucune fonctionnalité d'événement pouvant être exécutée lors de la connexion. Si vous jetez un œil à cette méthode, vous remarquerez qu'elle définit le client dans la session ainsi que distribue l'événement customer_login.
Avec cette approche, nous pouvons en fait avoir plusieurs agents connectés en tant que même client si nous choisissons (bien que nous ne voulions pas que plusieurs agents ajoutent au panier / passent des commandes en même temps sur le même compte).
Nous l'utilisons depuis deux ans maintenant sans aucun problème notable pendant cette période.
la source
setCustomerAsLoggedIn
dans mon code, pour la même raison que vous. Mais j'étais curieux de la méthode à utiliser pour l'autologin. (si ce n'est pas un secret).