Zobacz następujący scenariusz.
Mam niestandardowy moduł, który pozwala użytkownikowi frontendowi wykonywać pewne działania na niektórych niestandardowych obiektach. (szczegóły nie są tak naprawdę ważne).
Żądanie polega na tym, że administrator powinien mieć możliwość zalogowania się do interfejsu użytkownika za pomocą konta klienta (bez hasła) i wykonania tych czynności dla klienta.
Ponieważ nie możesz użyć sesji frontendowej z backendu i nie chcę tworzyć stałego linku autologin dla frontendu, ponieważ może to być duża dziura w zabezpieczeniach, to właśnie zrobiłem do tej pory.
- dodaj pusty atrybut dla jednostki klienta. (nazwijmy to
login_key
) - dodaj przycisk w zapleczu na stronie edycji klienta, który przekierowuje na stronę administratora, na której generowany jest losowy ciąg znaków i zapisywany w atrybucie
login_key
. - w tej samej akcji przekierowuję administratora do adresu URL frontonu takiego jak ten
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(wartość wygenerowana w poprzednim kroku). - na adresie frontend, jeśli identyfikator klienta i
login_key
dopasowanie do konkretnego klienta, to ustawiam obiekt klienta w sesji (po zalogowaniu) i usuwam,login_key
aby adres URL nie działał w przyszłości.
To szwy do pracy. Mam na myśli, że loguję się jako wybrany klient, a link użyty do automatycznego logowania nie działa po raz drugi.
Wadą jest to, że jeśli 2 administratorów kliknie przycisk „autologin” w tym samym czasie, nie uda się zalogować, ale jest to dopuszczalne ryzyko.
Moją główną obawą jest to, że może to być również (nie taki) duży problem bezpieczeństwa. Czy ktoś może zobaczyć coś złego w tym podejściu? lub sugerujesz lepszy?
Zignoruj fakt, że konta klientów można rozdzielić według stron internetowych. Nie jest to ważne i można je łatwo zarządzać.
Odpowiedzi:
Ponieważ nikt nie wpadł na dobry powód, aby nie robić tego, o co prosiłem, zakładam, że moja metoda jest w pewnym sensie bezpieczna. Aby nie pozostawiać otwartego pytania, postanowiłem dodać kod jako odpowiedź i oznaczyć go jako zaakceptowany.
Mam więc nowe rozszerzenie
Easylife_Simulate
o następujących plikach:app/etc/modules/Easylife_Simulte.xml
- plik deklaracji:app/code/local/Easylife/Simulte/etc/config.xml
- plik konfiguracyjnyapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- skrypt instalacyjny - dodaje nowy atrybut klienta:app/code/local/Easylife/Simulate/Model/Observer.php
- obserwator, aby dodać przycisk w formularzu edycji administratora klientaapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- kontroler administracyjny, który obsługuje kliknięcie przycisku wygenerowanego powyżej.app/code/local/Easylife/Simulate/controllers/IndexController.php
- kontroler frontendowy, który wykonuje autologin.app/code/local/Easylife/Simulte/Helper/Data.php
- pomocnik modułuOtóż to. Wydaje mi się, że dla mnie działa. Jak powiedziałem w pytaniu, minusem jest to, że jeśli 2 administratorów naciśnie przycisk logowania dla tego samego klienta (w przybliżeniu) w tym samym czasie, jeden z nich nie zostanie zalogowany. Ale może powtórzyć ten proces kilka sekund później.
źródło
W naszym zespole obsługi klienta stosujemy podobne podejście zwane „ghost ghost”, w którym przycisk administratora jest dostępny za pośrednictwem konta klienta. Nie używamy żadnych niestandardowych atrybutów dla login_key ani niczego podobnego i faktycznie używamy przesłoniętego / dostosowanego loginAction rozszerzonego z Mage_Customer_AccountController do przetwarzania logowania.
Dodatkowo, podczas loginAction, po naszej niestandardowej logice i weryfikacji, używamy Mage_Customer_Model_Session :: setCustomerAsLoggedIn, aby upewnić się, że nie tracimy żadnej funkcji zdarzenia, która może zostać wykonana podczas logowania. Jeśli spojrzysz na tę metodę, zauważysz, że ustawia ona klienta w sesji, a także wywołuje zdarzenie customer_login.
Dzięki takiemu podejściu możemy faktycznie zalogować się do wielu agentów jako ten sam klient, który powinniśmy wybrać (chociaż nie chcielibyśmy, aby wielu agentów dodawało do koszyka / składało zamówienia w tym samym czasie na tym samym koncie).
Używamy tego od dwóch lat bez istotnych problemów w tym czasie.
źródło
setCustomerAsLoggedIn
w moim kodzie, z tego samego powodu, co ty. Ale byłem ciekawy metody, jaką należy zastosować do autologiny. (jeśli to nie jest tajemnica).