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


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.