Lihat skenario berikut.
Saya memiliki beberapa modul khusus yang memungkinkan pengguna frontend untuk melakukan beberapa tindakan pada beberapa entitas kustom. (detailnya tidak terlalu penting).
Permintaannya adalah bahwa seorang admin harus dapat login di frontend dengan akun pelanggan (tanpa memiliki kata sandi) dan dapat melakukan tindakan tersebut untuk pelanggan.
Karena Anda tidak dapat menggunakan sesi frontend dari backend dan saya tidak ingin membuat tautan autologin permanen untuk frontend karena mungkin ada lubang keamanan besar inilah yang saya lakukan sejauh ini.
- tambahkan atribut kosong untuk entitas pelanggan. (sebut saja
login_key
) - tambahkan tombol di backend pada halaman edit pelanggan yang dialihkan ke halaman admin tempat string acak dihasilkan dan disimpan dalam atribut
login_key
. - dalam tindakan yang sama saya mengarahkan admin ke url frontend seperti ini
autologin/index/index/customer_id/7/login_key/ajkshdkjah123123
(nilai yang dihasilkan pada langkah sebelumnya). - di url frontend, jika id pelanggan dan
login_key
cocok untuk pelanggan tertentu maka saya menetapkan objek pelanggan dalam sesi (seperti masuk) dan menghapuslogin_key
agar url tidak akan berfungsi di masa mendatang.
Ini bekerja. Maksud saya, saya masuk sebagai pelanggan terpilih dan tautan yang digunakan untuk autologin tidak berfungsi untuk kedua kalinya.
Sisi buruknya adalah jika 2 admin mengklik tombol "autologin" sekitar waktu yang sama, seseorang akan gagal masuk, tetapi ini adalah risiko yang dapat diterima.
Kekhawatiran utama saya adalah bahwa ini mungkin juga masalah keamanan besar (bukan itu). Bisakah seseorang melihat sesuatu yang salah dengan pendekatan ini? atau menyarankan yang lebih baik?
Abaikan fakta bahwa akun pelanggan dapat dipisahkan oleh situs web. Ini tidak penting dan juga dapat dikelola dengan mudah.
Jawaban:
Karena tidak ada yang datang dengan alasan yang baik untuk tidak melakukan apa yang saya minta, saya berasumsi bahwa metode saya aman. Jadi, agar tidak membiarkan pertanyaan ini terbuka, saya memutuskan untuk menambahkan kode sebagai jawaban dan menandainya sebagai diterima.
Jadi saya memiliki ekstensi baru yang dipanggil
Easylife_Simulate
dengan file berikut:app/etc/modules/Easylife_Simulte.xml
- file deklarasi:app/code/local/Easylife/Simulte/etc/config.xml
- file konfigurasiapp/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php
- instal skrip - menambahkan atribut pelanggan baru:app/code/local/Easylife/Simulate/Model/Observer.php
- pengamat untuk menambahkan tombol di formulir edit admin pelangganapp/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php
- pengontrol admin yang menangani klik pada tombol yang dihasilkan di atas.app/code/local/Easylife/Simulate/controllers/IndexController.php
- pengendali frontend yang membuat autologin.app/code/local/Easylife/Simulte/Helper/Data.php
- pembantu modulItu dia. Tampaknya bekerja untuk saya. Seperti yang saya katakan dalam pertanyaan, downside adalah bahwa jika 2 admin menekan tombol login untuk pelanggan yang sama di (kurang-lebih) pada waktu yang sama, salah satunya tidak akan login. Tetapi dia dapat mengulangi prosesnya beberapa detik kemudian.
sumber
Kami menggunakan pendekatan serupa untuk tim layanan pelanggan kami yang disebut "ghost login" di mana kami menyediakan tombol melalui akun pelanggan di admin. Kami tidak menggunakan atribut khusus apa pun untuk login_key atau semacamnya dan sebenarnya menggunakan loginAction yang diganti / disesuaikan yang diperluas dari Mage_Customer_AccountController untuk memproses login.
Selain itu, selama loginAction, setelah logika dan validasi khusus kami, kami menggunakan Mage_Customer_Model_Session :: setCustomerAsLoggedIn untuk memastikan bahwa kami tidak kehilangan fungsionalitas acara apa pun yang dapat dijalankan selama login. Jika Anda melihat metode ini, Anda akan melihat bahwa itu menetapkan pelanggan di sesi serta mengirimkan acara customer_login.
Dengan pendekatan ini kita sebenarnya dapat memiliki beberapa agen masuk sebagai pelanggan yang sama yang harus kita pilih (walaupun kita tidak ingin memiliki banyak agen yang ditambahkan ke keranjang / menempatkan pesanan pada saat yang sama di akun yang sama).
Kami telah menggunakan ini selama dua tahun sekarang tanpa masalah penting selama waktu itu.
sumber
setCustomerAsLoggedIn
kode saya, untuk alasan yang sama seperti Anda. Tapi saya penasaran dengan metode yang digunakan untuk autologin. (jika itu bukan rahasia).