백엔드에서 프런트 엔드에 자동 로그인


15

다음 시나리오를 참조하십시오.
프런트 엔드 사용자가 일부 사용자 지정 엔터티에 대한 작업을 수행 할 수있는 사용자 지정 모듈이 있습니다. (세부 사항은 실제로 중요하지 않습니다).
요청은 관리자가 고객 계정으로 비밀번호를 사용하지 않고 프론트 엔드에 로그인하고 고객에 대해 해당 조치를 수행 할 수 있어야한다는 것입니다.
백엔드에서 프론트 엔드 세션을 사용할 수 없으며 프론트 엔드에 대한 영구 자동 로그인 링크를 만들고 싶지 않기 때문에 이것이 지금까지 내가 한 일입니다.

  • 고객 엔티티에 대한 빈 속성을 추가하십시오. (전화하자 login_key)
  • 고객 편집 페이지의 백엔드에 임의의 문자열이 생성되어 속성에 저장 되는 관리 페이지로 리디렉션되는 버튼을 추가 하십시오 login_key.
  • 동일한 작업에서 관리자를 이와 같은 프론트 엔드 URL로 리디렉션합니다 autologin/index/index/customer_id/7/login_key/ajkshdkjah123123(이전 단계에서 생성 된 값).
  • 프론트 엔드 URL에서 고객 ID login_key가 특정 고객 과 일치하면 세션에 고객 객체를 설정하고 로그인 login_key한 후 나중에 URL이 작동하지 않도록 삭제합니다 .

이 솔기가 작동합니다. 선택한 고객으로 로그인했는데 자동 로그인에 사용 된 링크가 두 번째로 작동하지 않습니다.
단점은 2 명의 관리자가 "autologin"버튼을 동시에 클릭하면 로그인에 실패하지만 이는 허용 가능한 위험입니다.
저의 주요 관심사는 이것이 큰 보안 문제 일 수도 있다는 것입니다. 이 방법으로 누군가가 잘못된 것을 볼 수 있습니까? 아니면 더 나은 것을 제안합니까?
고객 계정이 웹 사이트별로 분리 될 수 있다는 사실을 무시하십시오. 이것은 중요하지 않으며 쉽게 관리 할 수 ​​있습니다.


일반 관리자 URL 키가 보안을 많이 제공하지 않습니까?
kalenjordan

@kalenjordan 문제는 관리자 부분이 아닙니다. 솔기가 괜찮습니다. 내 관심사는 자동 로그인을위한 프론트 엔드 URL을 호출 할 때입니다. 거기에 관리자 URL 키를 사용할 수 없습니다.
Marius

아, 미안 magentocommerce.com/magento-connect/login-as-customer-9893.html 을 확인 하셨습니까? 프론트 엔드 컨트롤러에서 사용되는 고객 ID와 연관된 고유 해시와 함께 관리자가 로그인을 시도 할 때마다 고유 한 레코드를 생성합니다.
kalenjordan

@kalenjordan 하하. 나는 그 확장에 대해 몰랐다. 그러나 당신이 묘사 한 것은 질문에서 설명한 것과 같은 접근법입니다. :). 나는 그것을 볼 것이다. 감사.
Marius

1
@ mageUz.True, 그러나 내가 말했듯이, 그것은 허용되는 위험입니다. 보안에 더 관심이 있습니다.
Marius

답변:


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 명의 관리자가 같은 시간에 같은 고객의 로그인 버튼을 (대략) 동시에 누르면 그 중 하나가 로그인되지 않을 것입니다. 그러나 그는 몇 초 후에 프로세스를 반복 할 수 있습니다.


여러 고객이있는 경우 어떻게됩니까?
Milople Inc

@GarthHuff 귀하의 질문을 이해하지 못합니다. 시나리오를 설명하십시오.
Marius

내 생각에, 내가 한 일은 전체 사용자 시나리오를 변경 한 것입니다. 사용자 이름 입력 상자를 가능한 사용자 이름으로 드롭 다운으로 바꾸고 드롭 다운에서 사용자 이름을 선택하면 자동으로 로그인하십시오. 이것은 내 함침 techworkslab.pixub.com/2014/01/script-for-auto-login
Milople Inc

@GarthHuff. 스크립트에 감사하지만 내 문제는 관리자가 아닌 프론트 엔드 고객과 관련이 있습니다.
Marius

@Marius Magento 2 버전을 만들 계획입니까?
Dan

0

우리는 "고스트 로그인"이라는 고객 서비스 팀에 유사한 접근 방식을 사용합니다. 여기서 관리자의 고객 계정을 통해 버튼을 사용할 수 있습니다. 우리는 login_key 또는 이와 유사한 것에 사용자 정의 속성을 사용하지 않고 실제로 로그인을 처리하기 위해 Mage_Customer_AccountController에서 확장 된 재정의 / 사용자 정의 loginAction을 사용하고 있습니다.

또한 loginAction 동안 사용자 지정 논리 및 유효성 검사 후에 Mage_Customer_Model_Session :: setCustomerAsLoggedIn을 사용하여 로그인 중에 실행될 수있는 이벤트 기능을 잃지 않도록합니다. 이 방법을 살펴보면 세션에서 고객을 설정하고 customer_login 이벤트를 전달 함을 알 수 있습니다.

여기에 이미지 설명을 입력하십시오

이 방법을 사용하면 실제로 동일한 고객으로 여러 고객이 로그인하도록 할 수 있습니다 (동일한 계정으로 여러 명의 상담원이 동시에 장바구니에 추가 / 주문하기를 원하지는 않음).

우리는이 기간 동안 주목할만한 문제없이 2 년 동안 이것을 사용해 왔습니다.


1
정보 주셔서 감사합니다. 나는 또한 setCustomerAsLoggedIn당신과 같은 이유로 내 코드 에도 사용 합니다. 그러나 자동 로그인에 사용할 방법이 궁금했습니다. (비밀이 아닌 경우).
Marius

우리는 핵심 프론트 엔드 로그인 기능에서 확장되는이를 처리하기 위해 사용자 정의 모듈을 만들었습니다.
Anthony Leach Jr 14

나는 그것을 얻었다. 가능한 경우 일부 코드 또는 적어도 코드 배후에 대한 아이디어를 묻고있었습니다. 또는 내 아이디어가 안전하거나 그렇지 않은 경우 몇 가지 조언이 될 수 있습니다.
Marius
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.