/app/code/Magento/Customer/Model/Authentication.php
https://gitlab.com/crazybutterfly815/magento2 · PHP · 168 lines · 91 code · 19 blank · 58 comment · 9 complexity · 813b886a10f4e747d5c69f116fd18cf6 MD5 · raw file
- <?php
- /**
- * Copyright © 2016 Magento. All rights reserved.
- * See COPYING.txt for license details.
- */
- namespace Magento\Customer\Model;
- use Magento\Customer\Api\CustomerRepositoryInterface;
- use Magento\Backend\App\ConfigInterface;
- use Magento\Framework\Encryption\EncryptorInterface as Encryptor;
- use Magento\Framework\Exception\InvalidEmailOrPasswordException;
- use Magento\Framework\Exception\State\UserLockedException;
- class Authentication implements AuthenticationInterface
- {
- /**
- * Configuration path to customer lockout threshold
- */
- const LOCKOUT_THRESHOLD_PATH = 'customer/password/lockout_threshold';
- /**
- * Configuration path to customer max login failures number
- */
- const MAX_FAILURES_PATH = 'customer/password/lockout_failures';
- /**
- * @var CustomerRegistry
- */
- protected $customerRegistry;
- /**
- * Backend configuration interface
- *
- * @var \Magento\Backend\App\ConfigInterface
- */
- protected $backendConfig;
- /**
- * @var \Magento\Framework\Stdlib\DateTime
- */
- protected $dateTime;
- /**
- * @var Encryptor
- */
- protected $encryptor;
- /**
- * @var CustomerRepositoryInterface
- */
- protected $customerRepository;
- /**
- * @param CustomerRepositoryInterface $customerRepository
- * @param CustomerRegistry $customerRegistry
- * @param ConfigInterface $backendConfig
- * @param \Magento\Framework\Stdlib\DateTime $dateTime
- * @param Encryptor $encryptor
- */
- public function __construct(
- CustomerRepositoryInterface $customerRepository,
- CustomerRegistry $customerRegistry,
- ConfigInterface $backendConfig,
- \Magento\Framework\Stdlib\DateTime $dateTime,
- Encryptor $encryptor
- ) {
- $this->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->customerRepository->save($this->customerRepository->getById($customerId));
- }
- /**
- * {@inheritdoc}
- */
- public function unlock($customerId)
- {
- $customerSecure = $this->customerRegistry->retrieveSecureData($customerId);
- $customerSecure->setFailuresNum(0);
- $customerSecure->setFirstFailure(null);
- $customerSecure->setLockExpires(null);
- $this->customerRepository->save($this->customerRepository->getById($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;
- }
- }