I am using Magento version 2.3
Varnish 6 enabled
Docker setup
I am implementing force login on event ‘controller_action_predispatch’. Below is my code:
app/code/Vendor/Module/etc/frontend/events.xml
<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Event/etc/events.xsd">
<event name="controller_action_predispatch">
<observer name="kernel_request_before" instance="VendorModuleObserverFrontSendResponseBefore" shared="false" />
</event>
</config>
app/code/Vendor/Module/Observer/FrontSendResponseBefore.php
<?php
namespace VendorModuleObserver;
use MagentoFrameworkEventObserver as EventObserver;
use MagentoFrameworkEventObserverInterface;
class FrontSendResponseBefore implements ObserverInterface
{
private $_helper;
/**
* @var MagentoFrameworkAppResponseRedirectInterface
*/
protected $redirect;
private $_objectManager;
public function __construct(
VendorModuleHelperCoreHelper $helper,
MagentoFrameworkAppResponseRedirectInterface $redirect,
MagentoFrameworkObjectManagerInterface $objectmanager
) {
$this->_helper = $helper;
$this->redirect = $redirect;
$this->_objectManager = $objectmanager;
}
public function execute(MagentoFrameworkEventObserver $observer)
{
$actionName = $observer->getEvent()->getRequest()->getFullActionName();
$controller = $observer->getControllerAction();
$allowedUrls = array(
'customer_account_login',
'customer_account_loginPost',
'customer_account_logout',
'customer_account_logoutSuccess',
'customer_account_forgotpassword',
'customer_account_forgotpasswordpost',
'customer_account_createPassword',
'customer_account_createpassword',
'customer_account_resetpasswordpost'
);
$customerSession = $this->_objectManager->create('MagentoCustomerModelSessionFactory')->create();
$redirect = true;
if (!$this->ifForceLoginEnabledForStore()) {
$redirect = false;
} else if (in_array($actionName, $allowedUrls)) {
$redirect = false;
} elseif ($customerSession->isLoggedIn()) {
$redirect = false;
}
echo 4; die;
if ($redirect) {
$this->redirect->redirect($controller->getResponse(), 'customer/account/login');
}
}
private function ifForceLoginEnabledForStore()
{
$storeId = $this->_helper->getCurrentStoreId();
if ($this->_helper->getConfigValue('general/general/forcelogin', $storeId) == true) {
return true;
}
return false;
}
}
As you see I have added a die statement, but it does not execute when the cached version of page is loaded.
Does anyone has any idea how to fix this?