バックエンドからのフロントエンドでの自動ログイン


15

次のシナリオを参照してください。
フロントエンドユーザーがカスタムエンティティに対してアクションを実行できるカスタムモジュールがあります。(詳細はあまり重要ではありません)。
要求は、管理者が(パスワードを持たずに)顧客アカウントでフロントエンドにログインし、顧客に対してこれらのアクションを実行できるようにすることです。
バックエンドからフロントエンドセッションを使用することはできず、フロントエンド用の永続的な自動ログインリンクを作成したくないので、これは大きなセキュリティホールになる可能性があるため、これまで私がやったことです。

  • 顧客エンティティに空の属性を追加します。(それを呼び出しましょうlogin_key
  • ランダム文字列が生成されて属性に保存される管理ページにリダイレクトするボタンを顧客編集ページのバックエンドに追加しますlogin_key
  • 同じアクションで、管理者をこのようなフロントエンドURLにリダイレクトしautologin/index/index/customer_id/7/login_key/ajkshdkjah123123ます(前の手順で生成された値)。
  • フロントエンドURLでlogin_key、特定の顧客の顧客IDと一致する場合、セッションで顧客オブジェクトを設定し(ログインした状態で)login_key、URLが将来機能しないように削除します。

これでうまくいく。つまり、選択した顧客としてログインしますが、自動ログインに使用されるリンクが再度機能しません。
欠点は、2人の管理者がほぼ同時に「自動ログイン」ボタンをクリックすると、1人がログインに失敗することですが、これは許容できるリスクです。
私の主な懸念は、これが(それではなく)大きなセキュリティ問題かもしれないということです。誰かがこのアプローチで何か間違ったことを見ることができますか?またはより良いものを提案しますか?
顧客アカウントはWebサイトごとに分離できるという事実は無視してください。これは重要ではなく、簡単に管理できます。


通常の管理URLキーは同じくらいのセキュリティを提供しませんか?
kalenjordan

@kalenjordan問題は管理者の問題ではありません。縫い目はOKです。私の懸念は、自動ログインのフロントエンドURLを呼び出すときです。そこでは管理URLキーを使用できません。
マリウス

ああ、ごめんなさい。magentocommerce.com/magento-connect/login-as-customer-9893.htmlをチェックアウトしましたか?フロントエンドコントローラで使用される顧客IDに関連付けられた一意のハッシュを使用して、管理者によるログイン試行ごとに一意のレコードを生成します。
kalenjordan

@kalenjordanハハ。その拡張子については知りませんでした。しかし、あなたが説明したのは、私が質問で説明したのと同じアプローチです。:)。それを見ていきます。ありがとう。
マリウス

1
@ mageUz.True、しかし私が言ったように、それは許容できるリスクです。ここで私はセキュリティに関心があります。
マリウス

回答:


9

私が尋ねていたことをしない理由を誰も思いつかなかったので、私の方法は安全だと思います。したがって、この質問を未解決のままにしないために、コードを回答として追加し、承認済みとしてマークすることにしました。
そのEasylife_Simulateため、次のファイルで呼び出される新しい拡張子があります。- app/etc/modules/Easylife_Simulte.xml宣言ファイル:

<?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 -構成ファイル

<?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 -インストールスクリプト-新しい顧客属性を追加します。

<?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 -顧客管理者編集フォームにボタンを追加するオブザーバー

<?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 -上記で生成されたボタンのクリックを処理する管理コントローラー。

<?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 -自動ログインを行うフロントエンドコントローラー。

<?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 -モジュールヘルパー

<?php
class Easylife_Simulate_Helper_Data extends Mage_Core_Helper_Abstract{

}

それでおしまい。私のために働くことは継ぎ目です。私が質問で言ったように、2人の管理者が同じ顧客のログインボタンを(ほぼ)同時に押すと、そのうちの1人はログインしません。しかし、彼は数秒後にプロセスを繰り返すことができます。


複数の顧客がいる場合はどうなりますか?
Milople Inc 14年

@GarthHuffあなたの質問がわかりません。シナリオを説明してください。
マリウス

私が考えているのは、シナリオ全体を変更したことです。ユーザー名入力ボックスをドロップダウンで置き換えて、可能なユーザー名で置き換え、ユーザー名がドロップダウンから選択されたときに自動的にログインします これは私の実装ですtechworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff。スクリプトに感謝しますが、私の問題は、管理者ではなくフロントエンドの顧客に関連しています。
マリウス

@MariusこれのMagento 2バージョンを作る予定はありますか?
ダン

0

「ゴーストログイン」と呼ばれるカスタマーサービスチームに対して同様のアプローチを使用し、管理者のカスタマーアカウントを介してボタンを使用できるようにします。login_keyなどのカスタム属性を使用せず、実際にMage_Customer_AccountControllerから拡張されたオーバーライド/カスタマイズされたloginActionを使用してログインを処理しています。

さらに、loginAction中、カスタムロジックと検証の後、Mage_Customer_Model_Session :: setCustomerAsLoggedInを使用して、ログイン中に実行される可能性のあるイベント機能が失われないようにします。このメソッドを見ると、セッションで顧客を設定し、customer_loginイベントを送出していることがわかります。

ここに画像の説明を入力してください

このアプローチを使用すると、同じ顧客が選択した場合に複数のエージェントを実際にログインさせることができます(ただし、同じアカウントで複数のエージェントを同時にカート/注文に追加する必要はありません)。

私たちはこれを2年間使用してきましたが、その間は特に問題はありませんでした。


1
情報をありがとう。私もsetCustomerAsLoggedInあなたと同じ理由でコードで使用しています。しかし、私は自動ログインに使用する方法に興味がありました。(それが秘密でない場合)。
マリウス

コアフロントエンドログイン機能から拡張するカスタムモジュールを作成して、これを処理します。
アンソニーリーチジュニア

わかった。可能であれば、いくつかのコード、または少なくともコードの背後にあるアイデアについて尋ねました。または、私のアイデアが安全かどうかに関係なく、いくつかの指針があります。
マリウス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.