UpgradeCustomerPasswordObserver.php 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384
  1. <?php
  2. /**
  3. * Copyright © Magento, Inc. All rights reserved.
  4. * See COPYING.txt for license details.
  5. */
  6. namespace Magento\Customer\Observer;
  7. use Magento\Customer\Model\Customer;
  8. use Magento\Framework\Encryption\EncryptorInterface;
  9. use Magento\Framework\Event\ObserverInterface;
  10. use Magento\Customer\Api\CustomerRepositoryInterface;
  11. use Magento\Customer\Model\CustomerRegistry;
  12. /**
  13. * Class observer UpgradeCustomerPasswordObserver to upgrade customer password hash when customer has logged in
  14. */
  15. class UpgradeCustomerPasswordObserver implements ObserverInterface
  16. {
  17. /**
  18. * Encryption model
  19. *
  20. * @var EncryptorInterface
  21. */
  22. protected $encryptor;
  23. /**
  24. * @var CustomerRegistry
  25. */
  26. private $customerRegistry;
  27. /**
  28. * @var CustomerRepositoryInterface
  29. */
  30. private $customerRepository;
  31. /**
  32. * @param EncryptorInterface $encryptor
  33. * @param CustomerRegistry $customerRegistry
  34. * @param CustomerRepositoryInterface $customerRepository
  35. */
  36. public function __construct(
  37. EncryptorInterface $encryptor,
  38. CustomerRegistry $customerRegistry,
  39. CustomerRepositoryInterface $customerRepository
  40. ) {
  41. $this->encryptor = $encryptor;
  42. $this->customerRegistry = $customerRegistry;
  43. $this->customerRepository = $customerRepository;
  44. }
  45. /**
  46. * Upgrade customer password hash when customer has logged in
  47. *
  48. * @param \Magento\Framework\Event\Observer $observer
  49. * @return void
  50. */
  51. public function execute(\Magento\Framework\Event\Observer $observer)
  52. {
  53. $password = $observer->getEvent()->getData('password');
  54. /** @var \Magento\Customer\Model\Customer $model */
  55. $model = $observer->getEvent()->getData('model');
  56. $customer = $this->customerRepository->getById($model->getId());
  57. $customerSecure = $this->customerRegistry->retrieveSecureData($model->getId());
  58. if (!$this->encryptor->validateHashVersion($customerSecure->getPasswordHash(), true)) {
  59. $customerSecure->setPasswordHash($this->encryptor->getHash($password, true));
  60. // No need to validate customer and customer address while upgrading customer password
  61. $this->setIgnoreValidationFlag($customer);
  62. $this->customerRepository->save($customer);
  63. }
  64. }
  65. /**
  66. * Set ignore_validation_flag to skip unnecessary address and customer validation
  67. *
  68. * @param Customer $customer
  69. * @return void
  70. */
  71. private function setIgnoreValidationFlag($customer)
  72. {
  73. $customer->setData('ignore_validation_flag', true);
  74. }
  75. }