customerRepository = $customerRepository; $this->customerRegistry = $customerRegistry; $this->backendConfig = $backendConfig; $this->dateTime = $dateTime; $this->encryptor = $encryptor; } /** * @inheritdoc */ public function processAuthenticationFailure($customerId) { $now = new \DateTime(); $lockThreshold = $this->getLockThreshold(); $maxFailures = $this->getMaxFailures(); $customerSecure = $this->customerRegistry->retrieveSecureData($customerId); if (!($lockThreshold && $maxFailures)) { return; } $failuresNum = (int)$customerSecure->getFailuresNum() + 1; $firstFailureDate = $customerSecure->getFirstFailure(); if ($firstFailureDate) { $firstFailureDate = new \DateTime($firstFailureDate); } $lockThreshInterval = new \DateInterval('PT' . $lockThreshold . 'S'); $lockExpires = $customerSecure->getLockExpires(); $lockExpired = ($lockExpires !== null) && ($now > new \DateTime($lockExpires)); // set first failure date when this is the first failure or the lock is expired if (1 === $failuresNum || !$firstFailureDate || $lockExpired) { $customerSecure->setFirstFailure($this->dateTime->formatDate($now)); $failuresNum = 1; $customerSecure->setLockExpires(null); // otherwise lock customer } elseif ($failuresNum >= $maxFailures) { $customerSecure->setLockExpires($this->dateTime->formatDate($now->add($lockThreshInterval))); } $customerSecure->setFailuresNum($failuresNum); $this->getCustomerAuthUpdate()->saveAuth($customerId); } /** * @inheritdoc */ public function unlock($customerId) { $customerSecure = $this->customerRegistry->retrieveSecureData($customerId); $customerSecure->setFailuresNum(0); $customerSecure->setFirstFailure(null); $customerSecure->setLockExpires(null); $this->getCustomerAuthUpdate()->saveAuth($customerId); } /** * Get lock threshold * * @return int */ protected function getLockThreshold() { return $this->backendConfig->getValue(self::LOCKOUT_THRESHOLD_PATH) * 60; } /** * Get max failures * * @return int */ protected function getMaxFailures() { return $this->backendConfig->getValue(self::MAX_FAILURES_PATH); } /** * @inheritdoc */ public function isLocked($customerId) { $currentCustomer = $this->customerRegistry->retrieve($customerId); return $currentCustomer->isCustomerLocked(); } /** * @inheritdoc */ public function authenticate($customerId, $password) { $customerSecure = $this->customerRegistry->retrieveSecureData($customerId); $hash = $customerSecure->getPasswordHash() ?? ''; if (!$this->encryptor->validateHash($password, $hash)) { $this->processAuthenticationFailure($customerId); if ($this->isLocked($customerId)) { throw new UserLockedException(__('The account is locked.')); } throw new InvalidEmailOrPasswordException(__('Invalid login or password.')); } return true; } /** * Get customer authentication update model * * @return \Magento\Customer\Model\CustomerAuthUpdate * @deprecated 100.1.1 */ private function getCustomerAuthUpdate() { if ($this->customerAuthUpdate === null) { $this->customerAuthUpdate = \Magento\Framework\App\ObjectManager::getInstance()->get(CustomerAuthUpdate::class); } return $this->customerAuthUpdate; } }