Siehe folgendes Szenario.
Ich habe ein benutzerdefiniertes Modul, mit dem der Frontend-Benutzer einige Aktionen für einige benutzerdefinierte Entitäten ausführen kann. (Details sind nicht wirklich wichtig).
Die Anforderung ist, dass sich ein Administrator am Frontend mit dem Kundenkonto anmelden kann (ohne das Passwort zu haben) und diese Aktionen für den Kunden ausführen kann.
Da Sie die Frontend-Sitzung des Backends nicht verwenden können und ich keinen permanenten Autologin-Link für das Frontend erstellen möchte, da dies möglicherweise eine große Sicherheitslücke darstellt, habe ich dies bisher getan.
- Fügen Sie ein leeres Attribut für die Kundenentität hinzu. (Nennen wir es
login_key
) - Fügen Sie im Backend der Kundenbearbeitungsseite eine Schaltfläche hinzu, die auf eine umleitet Administrationsseite auf der eine zufällige Zeichenfolge generiert und im Attribut gespeichert wird
login_key
. - In der gleichen Aktion leite ich den Administrator auf eine Frontend-URL wie diese um
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(Wert, der im vorherigen Schritt generiert wurde). - Wenn die Kunden-ID und die
login_key
Übereinstimmung für einen bestimmten Kunden an der Frontend-URL übereinstimmen, setze ich das Kundenobjekt in der Sitzung (wie angemeldet) und lösche daslogin_key
die URL, damit die URL in Zukunft nicht mehr funktioniert.
Das scheint zu funktionieren. Ich werde als der ausgewählte Kunde angemeldet und der für die automatische Anmeldung verwendete Link funktioniert ein zweites Mal nicht.
Die Kehrseite ist, dass wenn 2 Administratoren gleichzeitig auf die Schaltfläche "Autologin" klicken, eine Anmeldung fehlschlägt, dies jedoch ein akzeptables Risiko darstellt.
Mein Hauptanliegen ist, dass dies auch ein (nicht so großes) Sicherheitsproblem sein kann. Kann jemand etwas falsch mit diesem Ansatz sehen? oder einen besseren vorschlagen?
Ignorieren Sie die Tatsache, dass die Kundenkonten nach Website getrennt werden können. Dies ist nicht wichtig und kann auch leicht verwaltet werden.
Antworten:
Da mir niemand einen guten Grund einfiel, nicht das zu tun, worum ich gebeten hatte, gehe ich davon aus, dass meine Methode sicher ist. Um diese Frage nicht offen zu lassen, habe ich beschlossen, den Code als Antwort hinzuzufügen und als akzeptiert zu markieren.
Ich habe also eine neue Endung
Easylife_Simulate
mit den folgenden Dateien:app/etc/modules/Easylife_Simulte.xml
- Die Deklarationsdatei:app/code/local/Easylife/Simulte/etc/config.xml
- die Konfigurationsdateiapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- install script - fügt ein neues Kundenattribut hinzu:app/code/local/Easylife/Simulate/Model/Observer.php
- Beobachter, um eine Schaltfläche im Bearbeitungsformular für Kundenadministratoren hinzuzufügenapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- Der Administrator-Controller, der den Klick auf die oben generierte Schaltfläche verarbeitet.app/code/local/Easylife/Simulate/controllers/IndexController.php
- der Frontend-Controller, der die automatische Anmeldung vornimmt.app/code/local/Easylife/Simulte/Helper/Data.php
- der ModulhelferDas ist es. Es scheint, für mich zu arbeiten. Wie ich in der Frage sagte, besteht der Nachteil darin, dass, wenn zwei Administratoren (ungefähr) gleichzeitig auf den Anmeldebutton desselben Kunden drücken, einer von ihnen nicht angemeldet ist. Er kann den Vorgang jedoch einige Sekunden später wiederholen.
quelle
Wir verwenden einen ähnlichen Ansatz für unser Kundenserviceteam mit dem Namen "Ghost Login", bei dem wir einen Button über das Kundenkonto in admin verfügbar machen. Wir verwenden keine benutzerdefinierten Attribute für login_key oder ähnliches und verwenden tatsächlich eine überschriebene / angepasste loginAction, die von Mage_Customer_AccountController erweitert wurde, um die Anmeldung zu verarbeiten.
Darüber hinaus verwenden wir während loginAction nach unserer benutzerdefinierten Logik und Überprüfung Mage_Customer_Model_Session :: setCustomerAsLoggedIn, um sicherzustellen, dass wir keine Ereignisfunktionalität verlieren, die möglicherweise während der Anmeldung ausgeführt wird. Wenn Sie sich diese Methode ansehen, werden Sie feststellen, dass sie den Kunden in die Sitzung versetzt und das customer_login -Ereignis auslöst.
Mit diesem Ansatz können sich tatsächlich mehrere Agenten als derselbe Kunde anmelden, den wir wählen sollten (obwohl wir nicht möchten, dass mehrere Agenten gleichzeitig Bestellungen auf demselben Konto auf den Warenkorb legen).
Wir verwenden dies seit zwei Jahren ohne nennenswerte Probleme in dieser Zeit.
quelle
setCustomerAsLoggedIn
in meinem Code, aus dem gleichen Grund wie Sie. Aber ich war neugierig auf die Methode für die automatische Anmeldung. (wenn es kein Geheimnis ist).