고객이 magento 2에 로그인했는지 여부를 확인하는 방법은 무엇입니까?


64

고객이 Magento 2에 로그인했는지 확인 하는 방법

고객이 로그인 한 경우 세션에서 고객 데이터를 얻는 방법은 무엇입니까?


여기에 언급 된 해결책 중 어느 것도 나를 위해 일하지 않았습니다. @Rakesh : 어떻게 작동했는지 공유 할 수 있습니까?
Ipsita Rout

Magento JS 모듈 ( text/x-magento-init) 내에서 로그인 상태를 확인해야하는 경우 ObjectManager 인스턴스화를 피하고 상태를 모듈의 구성 객체로 전달하는 대신 약간의 로그인 링크를 요청하여 오버 헤드를 줄일 수 있습니다. JS 모듈 내에서 : 예 :var isLoggedIn = $('.authorization-link > a').attr('href').indexOf('/login')<0;
thdoan


1
아래 줄은 무엇을하고 있습니까? var isLoggedIn = $ ( '. authorization-link> a'). attr ( 'href'). indexOf ( '/ login') <0;
Jaisa

답변:


62

다음 코드를 통해 고객 로그인 여부를 확인할 수 있습니다

$ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance ();
$ customerSession = $ objectManager-> get ( '마 젠토 \ 고객 \ 모델 \ 세션');
if ($ customerSession-> isLoggedIn ()) {
   // 고객 로그인 작업
}

컨트롤러에서

$ this-> _ objectManager-> get ( '마 젠토 \ 고객 \ 모델 \ 세션');
if ($ customerSession-> isLoggedIn ()) {
   // 고객 로그인 작업
}

1
물론 가장 확실한 솔루션이며 처음으로 사용했지만 고객 세션이 아직 초기화되지 않은 경우 제대로 작동하지 않는 것을 알았으므로 덜 분명하지만 지속 가능한 솔루션을 찾았습니다.
Mage2.PRO

11
객체 관리자를 직접 사용해서는 안됩니다. 세션 모델에 ObjectFactory 생성 코드를 삽입하기 만하면됩니다.
CarComp

6
답변에 다른 답변을 복사하지 마십시오.
Marius

6
디지털 피아니즘의 라파엘 (Raphael)이 답을 구한 것은 "잘못된"방법입니다.
Lorenzo

1
전체 페이지 캐시를 사용하도록 설정하고이를 블록 / 템플릿에서 호출하면 고객 세션이 항상 빈 상태로 반환되므로 작동하지 않습니다. http 컨텍스트를 사용하여 대신 확인하십시오.
leo

84

중요한 알림 : Object Manager를 직접 호출해서는 안됩니다.

따라서 깨끗한 방법으로 수행하는 방법은 다음과 같습니다.

템플릿을 제외한 모든 클래스

먼저 생성자에 다음 클래스를 주입해야합니다. /Magento/Customer/Model/Session:

protected $_session;

public function __construct(
    ...
    \Magento\Customer\Model\Session $session,
    ...
) {
    ...
    $this->_session = $session;
    ...
}

그런 다음 수업에서 다음을 호출 할 수 있습니다.

if ($this->_session->isLoggedIn()) {
    // Customer is logged in 
} else {
    // Customer is not logged in
}

템플릿에서

깔끔한 방법으로 템플릿을 렌더링하는 블록에 대한 환경 설정을 설정해야하므로 템플릿에서 약간 더 많은 작업이 필요합니다.

<preference for="Block\That\Renders\The\Template"
            type="Vendor\Module\Block\Your\Custom\Block" />

그런 다음 사용자 정의 블록 생성자에서 모든 클래스와 동일한 종속성 주입을 따라야합니다 (위에서 설명).

여기서 추가 단계는 고객이 로그인했는지 여부를 확인하기 위해 템플릿에서 사용할 수있는 공개 방법을 만드는 것입니다.

public function isCustomerLoggedIn()
{
    return $this->_session->isLoggedIn();
}

그런 다음 템플릿에서 다음을 호출 할 수 있습니다.

if ($block->isCustomerLoggedIn()) {
    // Customer is logged in
} else {
    // Customer is not logged in
}

고객 세션이 아직 초기화되지 않은 경우 대안

Magento\Framework\App\Http\Context대신에 사용하는 다른 방법이 있습니다.Magento/Customer/Model/Session

그런 다음 고객이 로그인했는지 여부를 확인하는 $this->_context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH)대신 전화 를 걸 수 있습니다 $this->_session->isLoggedIn().

이 방법은 당신에게 다른 결과를 제공 할 수 있습니다 그러나 , 나는 당신이 더 많은 정보는이 훌륭한 대답을 읽으십시오 : https://magento.stackexchange.com/a/92133/2380


<preference ... />맞춤 테마 내 에서 태그를 어디에 배치해야 하나요? 무엇 정확히 Block\That\Renders\The\Template하고 Vendor\Module\Block\Your\Custom\Block?
Andrea

@Andrea 잘 달려 있으며 각 경우마다 다릅니다. 그래서 제 대답에 일반적인 클래스 경로 이름을 사용했습니다.
Digital Pianism의 Raphael

class Html extends \Magento\Framework\View\Element\Template생성자에서 세션 객체를 주입 할 수있는 위치로 정의 된 사용자 정의 블록이 있습니다. 레이아웃 xml 파일에서 이런 방식으로 사용자 정의 테마 내에서이 블록을 사용합니다 <block class="Vendor\ThemeName\Block\Html" template="Vendor_ModuleName::html/my-custom-template.phtml"/>. 템플릿 파일 내에서 로그 된 사용자를 확인하고 싶습니다 my-custom-template.phtml. `<preference ... /> 태그를 어떻게 사용해야합니까?
Andrea

-> isLoggedin () 메서드가 작동하지 않습니다. 왜 그런지 모르겠지만 고객이 로그인했다는 것을 결코 반환하지 않습니다. 로그인되어 있습니다 (로그인되었습니다).
Vladimir Despotovic

@VladimirDespotovic 대체 방법을 테스트 했습니까?
디지털 피아니즘의 Raphael

31

그것은을 통해 가능하다 Magento\Framework\App\Http\Context또는를 통해 Magento\Customer\Model\Session. 그러나 결과가 다를 수 있습니다.

  • HTTP 컨텍스트는 고객 세션보다 먼저 초기화됩니다 (하지만 둘 다 조치 컨트롤러에서 초기화되므로 중요하지 않습니다)
  • PageCache모듈 (생산에 아마 항상)에 즉시 레이아웃 생성을 시작으로, 고객 세션에 의해 삭제됩니다 염두에 두어야 \Magento\PageCache\Model\Layout\DepersonalizePlugin::afterGenerateXml모든 캐시 페이지를 참조하십시오. 이제 고객이 HTTP 컨텍스트를 통해 로그인했는지 확인하면 여전히 '예'라고 표시되지만 고객 세션에서 더 이상 고객 데이터를 사용할 수 없습니다. 따라서 고객 세션에서 데이터에 액세스하기 전에 이중 점검이 필요합니다. 이것은 블록에서 쉽게 발생할 수 있지만 액션 컨트롤러에는 없을 것입니다. 수동으로 레이아웃을 생성 할 것으로 예상되지 않기 때문에 액션 컨트롤러가 인스턴스를 반환 한 후에 생성됩니다.ResultInterface

PageCache가 켜져있을 때 설명 된 불일치의 위험을 제거하려면 이미 초기화 된 경우 고객 세션 사용을 고려하십시오 (액션 컨트롤러의 경우). 그렇지 않으면 HTTP 컨텍스트를 사용하십시오.


PageCache에 대한
유용한

3
@Alex 아래 코드를 사용하고 있습니다 $ customerSession = $ objectManager-> get ( 'Magento \ Framework \ App \ Http \ Context'); $ isLoggedIn = $ customerSession-> getValue (\ Magento \ Customer \ Model \ Context :: CONTEXT_AUTH); 그러나 캐시 사용으로 인해 로그인 한 고객에게 로그 아웃하는 대신 로그인 옵션을 표시합니다. 이 문제를 어떻게 해결해야합니까?
Nitesh

이 말은 우리의 의견에 감사합니다. 대답은 더 많은주의가 필요합니다 :-) 프로덕션에서 활성화되는 캐시는 세션을 어렵게 만듭니다. 사용자 지정 magento 플러그인을 작성하는 경우 경로의 XML 파일에 cachable = false를 입력하십시오.
Ligemer

2
왜 cachable = false를 넣어야합니까?
LucScu

15
/** @var \Magento\Framework\App\ObjectManager $om */
$om = \Magento\Framework\App\ObjectManager::getInstance();
/** @var \Magento\Framework\App\Http\Context $context */
$context = $om->get('Magento\Framework\App\Http\Context');
/** @var bool $isLoggedIn */
$isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);

그래서 어떻게 custommer는 login @ Mage2.PRO입니까?
xanka

8
ObjectManager를 직접 사용해서는 안됩니다.
7ochem

예, 동의했습니다. Objectmanager는 갈 길이 없습니다. 클래스 생성자에 CustomerFactory를 삽입하십시오.
CarComp

위의 해결책이 저에게
효과적이지

@lpsita이 문제가 있으면 알려주세요. 방금 수정 :)
Jai

10

이 솔루션들 중 어느 것도 나를 위해 일하지 않았습니다. 일부 페이지는 로그인 한 것으로 보이지만 다른 페이지는 로그인하지 않은 것입니다. 이것이 버그 인 것 같습니다.

https://github.com/magento/magento2/issues/3294

내 템플릿에서 호출 할 수있는 도우미를 만들었습니다.

<?php
namespace MyVendor\MyModule\Helper;

use Magento\Framework\App\Helper\AbstractHelper;

/**
 * Created by Carl Owens (carl@partfire.co.uk)
 * Company: PartFire Ltd (www.partfire.co.uk)
 **/
class Data extends AbstractHelper
{
    /**
     * @var \Magento\Framework\App\Http\Context
     */
    private $httpContext;

    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Framework\App\Http\Context $httpContext
    ) {
        parent::__construct($context);
        $this->httpContext = $httpContext;
    }

    public function isLoggedIn()
    {
        $isLoggedIn = $this->httpContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
        return $isLoggedIn;
    }
}

그런 다음 템플릿에서 도우미를 다음과 같이 사용할 수 있습니다.

<?php
$helper = $this->helper('MyVendor\MyModule\Helper\Data');

if ($helper->isLoggedIn()) {
    //show something
}

사실, 나를 위해 일한 유일한 코드는 당신 코드입니다. 감사합니다!
George George

->getCustomer()->getName()세션을 사용하는 경우 모든 페이지에서 작동하지 않기 때문에 컨텍스트를 사용하여 호출하는 방법은 무엇입니까 ?
George George

전체 페이지 캐시가 활성화 된 경우 정답입니다. customersession을 먼저 확인할 수 있으며 false를 리턴하면이를 수행 할 수 있습니다.
CompactCode

9

사용자가 템플릿에 로그인하게하려면 단 한 줄로 도우미를 호출하면됩니다.

<?php $_loggedin = $this->helper('Magento\Checkout\Helper\Cart')->getCart()->getCustomerSession()->isLoggedIn(); ?>

<?php if( $_loggedin ) : ?>

     <div><!-- add your code --></div>

<?php endif; ?>

objectmanager를 사용하지 않고 좋은 솔루션.
Nitesh

2
프로덕션 모드에서 FPC 및 Varnish가 활성화 된 v2.1.5에서는 작동하지 않았습니다.
thdoan

8

여기의 솔루션 중 어느 것도 프로덕션 모드에서 전체 페이지 캐시 및 니스가 활성화 된 Magento v2.1에서 안정적으로 작동하지 않았습니다. 마침내 아이디어를 얻은 후 모든 캐싱을 사용하여 100 %의 시간 동안 작동하는 솔루션을 찾았습니다 vendor/magento/module-theme/view/frontend/templates/html/header.phtml. 다음은 사용자가 로그 아웃 할 때 "로그인"링크와 사용자가 로그인 할 때 "로그 아웃"링크를 표시하는 솔루션입니다.

<li data-bind="scope: 'customer'">
  <!-- ko if: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/logout'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign Out') ?></a>
  <!-- /ko -->
  <!-- ko ifnot: customer().firstname  -->
  <a href="<?php echo $this->getUrl('customer/account/login'); ?>" style="display:none;" data-bind="style: {display:'inline'}"><?php echo __('Sign In') ?></a>
  <!-- /ko -->
  <script type="text/x-magento-init">
  {
    "*": {
      "Magento_Ui/js/core/app": {
        "components": {
          "customer": {
            "component": "Magento_Customer/js/view/customer"
          }
        }
      }
    }
  }
  </script>
</li>

업데이트 : v2.1.5 부터이 솔루션은 더 이상 신뢰할 수 없습니다. 해결책 은 문제 9156 을 참조하십시오 .


좋은 해결책입니다. 레이아웃 파일에서 cachable = "false"를 사용할 수 있지만
Dinesh Yadav

내가 가진 cachable="false"이 블록에 대한 레이아웃 XML에 있지만, 니스는 아직 분명히 캐싱된다. 이것이 버그인지 확실하지 않지만 Knockout은 이것을 피하는 좋은 방법입니다. 유일한 단점은 KO 바인딩으로 인해 로그인 / 아웃 링크가 나타나기 전에 약간의 지연이 있다는 것입니다.
thdoan

6

이런 식으로 진행되는 많은 답변이 있습니다 ...

객체 관리자 가져 오기 클래스 모델 DO STUFF

이것은 Magento2.0에서 사용하는 잘못된 방법입니다. 2.0에서는 자동 생성 된 객체 팩토리가 사용됩니다. 거의 모든 클래스 에서 생성자에 삽입하여 사용할 수 있습니다. 예:

public function __construct(
            Context $context,
            CollectionFactory $cmspageCollectionFactory,
            array $data = [],
            CustomerFactory $customerFactory,
            SessionFactory $sessionFactory)
        {
            parent::__construct($context, $data);
            $this->_cmspageCollectionFactory = $cmspageCollectionFactory;
            $this->customerFactory = $customerFactory;
            $this->sessionFactory = $sessionFactory;
        }

        /**
         * @return \Stti\Healthday\Model\ResourceModel\Cmspage\Collection
         */
        public function getCmspages()
        {
            // First check to see if someone is currently logged in.
            $customerSession = $this->sessionFactory->create();
            if ($customerSession->isLoggedIn()) {
                // customer is logged in;
                //$customer = $this->customerFactory->create()->get
            }

2
팩토리에 대한 오류가 발생하면 전체 경로를 사용하십시오 (예 :) \Magento\Customer\Model\SessionFactory $sessionFactory.
thdoan

옳은. 나는 보통 그것들을 맨 위에 선언한다. 그래서 나의 방법은 큰 혼란처럼 보이지 않는다. :)
CarComp

3

여기에 답변이 있습니다.

$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->create('Magento\Customer\Model\Session');

if ($customerSession->isLoggedIn()) {
    $customerSession->getCustomerId();  // get Customer Id
    $customerSession->getCustomerGroupId();
    $customerSession->getCustomer();
    $customerSession->getCustomerData();

    echo $customerSessionget->getCustomer()->getName();  // get  Full Name
    echo $customerSessionget->getCustomer()->getEmail(); // get Email
}

소스 .

$customerSession = $objectManager->get('Magento\Customer\Model\Session');

create로 대체 된 get이 정상적으로 작동합니다.

$customerSession = $objectManager->create('Magento\Customer\Model\Session');

4
ObjectManager직접 사용해서는 안됩니다
7ochem

enabled-cache가 아닌 캐시가 비활성화 된 경우에만 작동합니다.
Jai

@Jai, 이것은 개발 및 생산에서도 저를 위해 일합니다. 문제를 재현하는 단계를 알려주시겠습니까?
Manish

사용자가 로그인했는지 확인해야합니다. 그러나 아래 코드는 비활성화 된 캐시에서만 작동합니다. $ objectManager = \ Magento \ Framework \ App \ ObjectManager :: getInstance (); $ customerSession = $ objectManager-> 만들기 ( 'Magento \ Customer \ Model \ Session'); if ($ customerSession-> isLoggedIn ()) {// CODE}
Jai

캐시 사용 : 홈페이지 및 다른 사이트 페이지가 아닌 사용자 지정 대시 보드 페이지에서만 작동합니다. 내 질문 : magento.stackexchange.com/q/177964/29175
Jai

3

이것은 또한 "고객이 Magento2에 로그인했는지 확인하십시오"솔루션 중 하나입니다.

아래 코드를 사용해보십시오 :

 $om = \Magento\Framework\App\ObjectManager::getInstance();
 $context = $om->get('Magento\Framework\App\Http\Context');
 $isLoggedIn = $context->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
 if($isLoggedIn){
      echo "Yes Customer loggedin";
      echo "<pre>";print_r($context->getData()); 
 }

2

아래 코드를 사용해보십시오 :

<?php
namespace YourCompany\ModuleName\Helper;

class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    public function __construct(
        \Magento\Framework\App\Helper\Context $context,
        \Magento\Customer\Model\Session $customerSession
    ) {
        $this->customerSession = $customerSession;
        parent::__construct($context);
    }

public function isLoggedIn() // You can use this fucntion in any phtml file
    {
        return $this->customerSession->isLoggedIn();
    }
}

phtml 파일에서 위 코드를 사용하려면 isLoggedIn () 함수를 다음과 같이 호출 할 수 있습니다.

<?php $helper = $this->helper('YourCompany\ModuleName\Helper\Data'); ?>
<?php if($helper->isLoggedIn()) : ?>
    logged in
<?php else : ?>
    not logged in
<?php endif; ?> 

도움이 되었기를 바랍니다.


안녕하세요 @Shubdham, 작동하지 않습니다 ..
jafar pinjar

이것은 깔끔한 솔루션입니다. 감사합니다
Bytes

네, 도움이 되길 바랍니다.
Shubham Khandelwal

2

최고의 솔루션을 얻었습니다. 고객 인증을 기반으로 합니다 . 일부 고객 세션 이 작동하지 않았지만 솔루션이 작동 할 때마다 한 번 보자.

<?php
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Block\Account\AuthorizationLink');
if ($customerSession->isLoggedIn() == true) {
//your code.
} ?>

감사.


1

현재 일한 솔루션 (IMHO)

<?php

namespace My\Module\Helper\Data;

/**
 * @var \Magento\Framework\ObjectManagerInterface
 */
protected $objectManager;

/**
 * @var \Magento\Customer\Model\SessionFactory
 */
protected $customerSession;

/**
 * Class Data
 */
class Data extends \Magento\Framework\App\Helper\AbstractHelper
{
    /**
     * @param \Magento\Framework\ObjectManagerInterface $objectManager
     */
    public function __construct(
         \Magento\Framework\ObjectManagerInterface $objectManager
    )
    {
        $this->objectManager   = $objectManager;
        $this->customerSession = $this->objectManager->create('Magento\Customer\Model\SessionFactory')->create();
    }

    /**
     * @return \Magento\Customer\Model\SessionFactory
     */
    public function getCustomerSession()
    {
       return $this->customerSession;     
    }

    /**
     * @return bool
     */
    public function isCustomerLoggedIn()
    {
        return ($this->getCustomerSession()->isLoggedIn()) ? true : false;
    }
}

1

로그인 한 고객을 확인하려면 phtml 파일에서이 코드를 사용하십시오.

$om = \Magento\Framework\App\ObjectManager::getInstance();
$appContext = $om->get('Magento\Framework\App\Http\Context');
$isLoggedIn = $appContext->getValue(\Magento\Customer\Model\Context::CONTEXT_AUTH);
if($isLoggedIn) {
    /** LOGGED IN CUSTOMER, this should work in template   **/
}

2
ObjectManager직접 사용 해서는 안되며 템플릿에서이 유형의 코드를 사용해서는 안됩니다. 이를 관리하려면 블록 클래스에서 기능을 작성해야합니다.
7ochem

올바르게 수행하는 방법을 알고 나면 다른 방법으로 어떻게 관리해야하는지 궁금해 할 것입니다.
CarComp

0
$objectManager = \Magento\Framework\App\ObjectManager::getInstance();
$customerSession = $objectManager->get('Magento\Customer\Model\Session');

if($customerSession->isLoggedIn()) {

}

0

또 다른 대답 :

<?php $_loggedin = $block->getLayout()->createBlock('Magento\Customer\Block\Account\AuthorizationLink')->isLoggedIn() ?>
 <?php if( $_loggedin ) : ?>
   // your code
 <?php endif; ?>

어떻게 생각해?


0

Magento 기본 FPC 캐시를 활성화 한 후 세션 모델에서 로그 상태를 가져 오면 작동하지 않습니다.이 경우 대신 SessionFactory를 사용해야합니다.

FPC 캐싱이 활성화 된 경우 세션이 시작되지 않습니다 (자세한 내용은 https://github.com/magento/magento2/issues/3294#issuecomment-328464943).

이를 해결하려면 예를 들어을 사용해야합니다 SessionFactory.

/**
* @var \Magento\Customer\Model\Session
*/
protected $_customerSessionFactory;

public function __construct(
    ....
    \Magento\Customer\Model\SessionFactory $customerSessionFactory
    ....
) 
{
    ....
    $this->_customerSessionFactory = $customerSessionFactory;
    ....
}

public function getCustomerId(){
  $customer = $this->_customerSessionFactory->create();
  echo $customer->getCustomer()->getId();
}

-1

Google에서 찾은 여러 가지 방법을 시도했지만 해결책이 없습니다. 그래서 핵심 기능을 확인하고 Object Manager를 사용하지 않고 고객이 로그인했는지 여부를 확인하기 위해 php 파일을 만들었습니다.


            / **
         * 고객 세션
         * 웹 기술 코드로 작성된 모듈
         * Vinay Sikarwar에 의해 개발
         * @var \ Magento \ Framework \ App \ Http \ Context
         * /
        보호 된 $ 세션;

        / **
         * 등록 생성자.
         * @param 컨텍스트 $ context
         * @param 배열 $ data
         * /
        공공 함수 __construct (
            문맥 $ context,
                    \ 마 젠토 \ 프레임 워크 \ 세션 \ 일반 $ session,
            배열 $ data
        )
        {
                    $ this-> _ session = $ session;
                    parent :: __ construct ($ 문맥, $ data);
        }

            / **
         * 고객 로그인 상태 확인
         *
         * @api
         * @ 반환 bool
         * /
        공용 함수 isCustomerLoggedIn ()
        {
            return (bool) $ this-> getCustomerId ()
                && $ this-> checkCustomerId ($ this-> getId ())
                &&! $ this-> getIsCustomerEmulated ();
        }
    }

자세한 내용은 여기를 참조하십시오 http://blog.webtechnologycodes.com/customer-loggedin-check-magento2

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.