Arka uçtan ön uçta otomatik oturum açma


15

Aşağıdaki senaryoya bakın.
Ön uç kullanıcı bazı özel varlıklar üzerinde bazı eylemleri gerçekleştirmek için izin veren bazı özel modülü var. (ayrıntılar gerçekten önemli değildir).
İstek, bir yöneticinin müşteri hesabıyla (şifre olmadan) kullanıcı arabiriminde oturum açabilmesi ve müşteri için bu işlemleri gerçekleştirebilmesidir.
Arka uçtaki ön uç oturumunu kullanamayacağınız ve büyük bir güvenlik deliği olabileceğinden, ön uç için kalıcı bir otomatik oturum açma bağlantısı oluşturmak istemiyorum.

  • müşteri varlığı için boş bir özellik ekleyin. (diyelim login_key)
  • müşteri düzenleme sayfasının arka ucuna, rastgele bir dizenin oluşturulduğu ve özelliğe kaydedildiği bir yönetici sayfasına yönlendiren bir düğme ekleyin login_key.
  • aynı eylemde, yöneticiyi böyle bir ön uç url'ye yönlendiririm autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(önceki adımda üretilen değer).
  • ön uç url'de, müşteri kimliği ve login_keybelirli bir müşteri için eşleşirse, oturumda müşteri nesnesini ayarladım (oturum açtığım gibi) ve login_keyurl'nin gelecekte çalışmayacak şekilde silin .

Bu işe yaradı. Yani, seçilen müşteri olarak giriş yapıyorum ve otomatik oturum açma için kullanılan bağlantı ikinci kez çalışmıyor.
Aşağı tarafı, 2 yöneticinin aynı anda "otomatik oturum açma" düğmesine tıklaması durumunda, oturum açmanın başarısız olacağı, ancak bu kabul edilebilir bir risktir.
Temel kaygım, bunun da büyük bir güvenlik sorunu olabileceğidir. Birisi bu yaklaşımda yanlış bir şey görebilir mi? ya da daha iyisini önerebilir misin?
Müşteri hesaplarının web sitesi ile ayrılabileceğini görmezden gelin. Bu önemli değildir ve kolayca yönetilebilir.


Düzenli yönetici URL anahtarları size bu kadar güvenlik sağlamaz mı?
kalenjordan

@kalenjordan Sorun yönetici bölümü değil. Bu dikişler iyi. Benim endişem, otomatik giriş için ön uç URL'sini çağırmak. Orada yönetici URL anahtarlarını kullanamıyorum.
Marius

Ah, üzgünüm. Magentocommerce.com/magento-connect/login-as-customer-9893.html adresini kontrol ettiniz mi? Yönetici tarafından her giriş denemesi için benzersiz bir kayıt oluşturur ve ön uç denetleyicide kullanılan müşteri kimliğiyle ilişkili benzersiz bir karması vardır.
kalenjordan

@kalenjordan Ha Ha. O uzantıyı bilmiyordum. ama tarif ettiğinizle, soruda tarif ettiğim yaklaşımın aynısı. :). Bi 'bakacağım. Teşekkürler.
Marius

1
@ mageUz.True, ama dediğim gibi, bu kabul edilebilir bir risk. Burada güvenlikle daha fazla ilgileniyorum.
Marius

Yanıtlar:


9

Kimse istediğim şeyi yapmamak için iyi bir neden bulamadığından, yöntemimin güvende olduğunu varsayıyorum. Bu nedenle, bu soruyu açık bırakmamak için kodu bir cevap olarak eklemeye ve kabul edildi olarak işaretlemeye karar verdim.
Bu yüzden Easylife_Simulateaşağıdaki dosyalarla çağrılan yeni bir uzantı var : app/etc/modules/Easylife_Simulte.xml- bildirim dosyası:

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Simulate>
            <codePool>local</codePool>
            <active>true</active>
            <depends>
                <Mage_Customer />
            </depends>
        </Easylife_Simulate>
    </modules>
</config>

app/code/local/Easylife/Simulte/etc/config.xml - yapılandırma dosyası

<?xml version="1.0"?>
<config>
    <modules>
        <Easylife_Simulate>
            <version>0.0.1</version>
        </Easylife_Simulate>
    </modules>
    <global>
        <helpers>
            <easylife_simulate>
                <class>Easylife_Simulate_Helper</class>
            </easylife_simulate>
        </helpers>
        <models>
            <easylife_simulate>
                <class>Easylife_Simulate_Model</class>
            </easylife_simulate>
        </models>
        <resources>
            <easylife_simulate_setup>
                <setup>
                    <module>Easylife_Simulate</module>
                    <class>Mage_Customer_Model_Resource_Setup</class>
                </setup>
            </easylife_simulate_setup>
        </resources>
    </global>
    <frontend>
        <routers>
            <easylife_simulate>
                <use>standard</use>
                <args>
                    <module>Easylife_Simulate</module>
                    <frontName>simulate</frontName>
                </args>
            </easylife_simulate>
        </routers>
    </frontend>
    <adminhtml>
        <events>
            <controller_action_layout_render_before_adminhtml_customer_edit>
                <observers>
                    <easylife_simulate>
                        <class>easylife_simulate/observer</class>
                        <method>addAutoLoginButton</method>
                    </easylife_simulate>
                </observers>
            </controller_action_layout_render_before_adminhtml_customer_edit>
        </events>
    </adminhtml>
    <admin>
        <routers>
            <adminhtml>
                <args>
                    <modules>
                        <Easylife_Simulate before="Mage_Adminhtml">Easylife_Simulate_Adminhtml</Easylife_Simulate>
                    </modules>
                </args>
            </adminhtml>
        </routers>
    </admin>
</config>

app/code/local/Easylife/Simulate/sql/easylife_simulate_setup/install-0.0.1.php - komut dosyasını yükle - yeni bir müşteri özelliği ekler:

<?php
$this->addAttribute('customer', 'login_key', array(
    'type'      => 'text',
    'label'     => 'Auto login key',
    'input'     => 'text',
    'position'  => 999,
    'required'  => false
));

app/code/local/Easylife/Simulate/Model/Observer.php - müşteri yöneticisi düzenleme formuna bir düğme eklemek için gözlemci

<?php
class Easylife_Simulate_Model_Observer extends Mage_ProductAlert_Model_Observer{
    public function addAutoLoginButton($observer){
        $block = Mage::app()->getLayout()->getBlock('customer_edit');
        if ($block){
            $customer = Mage::registry('current_customer');
            $block->addButton('login', array(
                'label'     => Mage::helper('customer')->__('Login as this customer'),
                'onclick'   => 'window.open(\''.Mage::helper('adminhtml')->getUrl('adminhtml/simulate/login', array('id'=>$customer->getId())).'\')',
            ), 100);
        }

    }
}

app/code/local/Easylife/Simulate/controllers/Adminhtml/SimulateController.php - yukarıda oluşturulan düğmeye tıklamayı işleyen yönetici denetleyicisi.

<?php
class Easylife_Simulate_Adminhtml_SimulateController extends Mage_Adminhtml_Controller_Action{
    public function loginAction(){
        $id = $this->getRequest()->getParam('id');
        $customer = Mage::getModel('customer/customer')->load($id);
        if (!$customer->getId()){
            Mage::getSingleton('adminhtml/session')->addError(Mage::helper('easylife_simulate')->__('Customer does not exist'));
            $this->_redirectReferer();
        }
        else {
            $key = Mage::helper('core')->uniqHash();
            $customer->setLoginKey($key)->save();
            $this->_redirect('simulate/index/index', array('id'=>$customer->getId(), 'login_key'=>$key));
        }
    }
}

app/code/local/Easylife/Simulate/controllers/IndexController.php - otomatik giriş yapan ön uç kontrolörü.

<?php
class Easylife_Simulate_IndexController extends Mage_Core_Controller_Front_Action{
    public function indexAction(){
        $id = $this->getRequest()->getParam('id');
        $key = $this->getRequest()->getParam('login_key');
        if (empty($key)){
            $this->_redirect('');
        }
        else{
            $customer = Mage::getModel('customer/customer')->load($id);
            if ($customer->getId() && $customer->getLoginKey() == $key){
                $customer->setLoginKey('')->save();
                Mage::getSingleton('customer/session')->setCustomerAsLoggedIn($customer);
                Mage::getSingleton('customer/session')->renewSession();
            }
            $this->_redirect('customer/account/index');
        }
    }
}

app/code/local/Easylife/Simulte/Helper/Data.php - modül yardımcısı

<?php
class Easylife_Simulate_Helper_Data extends Mage_Core_Helper_Abstract{

}

Bu kadar. Benim için çalışmak dikişler. Dediğim gibi, dezavantajı, 2 yöneticinin aynı müşteri için (yaklaşık) aynı anda giriş düğmesine basması durumunda, bunlardan biri giriş yapılmayacaktır. Ancak birkaç saniye sonra işlemi tekrarlayabilir.


Birden fazla müşteri olduğunda ne olur?
Milople Inc

@GarthHuff Sorunuzu anlamıyorum. Lütfen senaryonuzu açıklayın.
Marius

sanırım, ne yaptığım tüm senaryo değiştirmek var Kullanıcı adı giriş kutusu açılır ile olası kullanıcı adı ile değiştirin ve kullanıcı adı açılan seçildiğinde otomatik olarak oturum açın. Bu benim implmentation techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff. Senaryo için teşekkürler, ama benim sorun yöneticileri değil, ön uç müşterileri ile ilgilidir.
Marius

@Marius, bunun Magento 2 versiyonunu yapmayı planlıyor musunuz?
Dan

0

Yönetici içinde müşteri hesabı aracılığıyla bir düğmeyi kullanıma sunduğumuz "hayalet giriş" adlı müşteri hizmetleri ekibimiz için benzer bir yaklaşım kullanıyoruz. Login_key veya bunun gibi herhangi bir özel özellik kullanmıyoruz ve aslında giriş işlemini işlemek için Mage_Customer_AccountController'dan genişletilmiş geçersiz kılınmış / özelleştirilmiş bir loginAction kullanıyoruz.

Buna ek olarak, loginAction sırasında, özel mantık ve doğrulama işlemimizden sonra, oturum açma sırasında yürütülebilecek herhangi bir etkinlik işlevini kaybetmediğimizden emin olmak için Mage_Customer_Model_Session :: setCustomerAsLoggedIn kullanıyoruz. Bu yönteme bakarsanız, müşteriyi oturumda ayarladığını ve customer_login olayını gönderdiğini fark edeceksiniz.

resim açıklamasını buraya girin

Bu yaklaşımla, aynı müşteriyi seçmemiz gereken şekilde birden fazla aracıya giriş yapabiliriz (ancak aynı hesaba aynı anda alışveriş sepetine / sipariş vermek için birden fazla aracıya sahip olmak istemeyiz).

Bunu iki yıldır, o dönemde kayda değer bir sorun olmadan kullanıyoruz.


1
Bilgi için teşekkürler. Kodumda da kullandığınız setCustomerAsLoggedIngibi aynı nedenle kullanıyorum. Ama otomatik giriş için kullanılacak yöntemi merak ettim. (bu bir sır değilse).
Marius

Çekirdek ön uç giriş işlevinden genişleyen bu özelliğin üstesinden gelmek için özel bir modül oluşturduk.
Anthony Leach Jr

Anladım. Mümkünse bazı kodları veya en azından kodun arkasındaki fikri soruyordum. Ya da benim fikrim güvenli olup olmadığına dair bazı işaretçiler olabilir.
Marius
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.