Cách thay đổi mật khẩu khách hàng nhanh chóng trong Magento 2


11

Trong Magento 1 từ cấu hình quản trị viên trong phần Quản lý khách hàng, chúng tôi có thể cập nhật / thay đổi mật khẩu mới của khách hàng một cách dễ dàng.

Trong Magento 2 Gửi lại mật khẩu chỉ với email sẽ giúp ích, nhưng không phải lúc nào cũng vậy. Đây có thể là một câu hỏi đơn giản, nhưng đôi khi nó sẽ tiết kiệm rất nhiều thời gian.

  • Có cách nào dễ dàng để thay đổi mật khẩu của khách hàng trong Magento 2 không?

  • Có cách nào từ cơ sở dữ liệu mà chúng ta có thể trực tiếp thay đổi mật khẩu bằng loại mã hóa không?

Trợ giúp sẽ được đánh giá cao.


muốn thay đổi nó cho người dùng quản trị?
Suresh Chikani

Đồng thời xem magento.stackexchange.com/questions/137555/ . Có thể trùng lặp? Chỉ có một trạng thái rõ ràng để thay đổi mật khẩu của khách hàng "thông qua cơ sở dữ liệu" ...
7ochem

Câu trả lời:


8

Để dễ dàng thay đổi mật khẩu cho khách hàng hiện tại, bạn có thể nhập dữ liệu tệp CSV của khách hàng của trường id và mật khẩu email của khách hàng hiện tại. Bạn có thể cung cấp mật khẩu mà bạn muốn thay đổi và password_hash sẽ trống.

Vui lòng tham khảo các ảnh chụp màn hình dưới đây:

nhập mô tả hình ảnh ở đâynhập mô tả hình ảnh ở đây


13

Tạo một lệnh console sẽ là lựa chọn tốt nhất của bạn theo ý kiến ​​của tôi.

Chỉnh sửa: mô-đun có sẵn ở đây nếu bạn cần: https://github.com/digitalpianism/changepassword

Đây là một mô-đun sẽ làm điều đó (chỉ được thử nghiệm trên 2.1.2):

app/code/DigitalPianism/ChangePassword/etc/module.xml :

<?xml version="1.0"?>

<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:Module/etc/module.xsd">
    <module name="DigitalPianism_ChangePassword" setup_version="0.0.1">
        <sequence>
            <module name="Magento_Customer"/>
        </sequence>
    </module>
</config>

app/code/DigitalPianism/ChangePassword/etc/di.xml

<?xml version="1.0"?>
<config xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="urn:magento:framework:ObjectManager/etc/config.xsd">
    <type name="Magento\Framework\Console\CommandListInterface">
        <arguments>
            <argument name="commands" xsi:type="array">
                <item name="change_password" xsi:type="object">DigitalPianism\ChangePassword\Console\Command\ChangePassword</item>
            </argument>
        </arguments>
    </type>
</config>

app/code/DigitalPianism/ChangePassword/registration.php

<?php
\Magento\Framework\Component\ComponentRegistrar::register(
    \Magento\Framework\Component\ComponentRegistrar::MODULE,
    'DigitalPianism_ChangePassword',
    __DIR__
);

app/code/DigitalPianism/ChangePassword/Console/Command/ChangePassword.php

<?php

namespace DigitalPianism\ChangePassword\Console\Command;

use Symfony\Component\Console\Command\Command;
use Symfony\Component\Console\Input\InputOption;
use Symfony\Component\Console\Input\InputInterface;
use Magento\Customer\Model\CustomerRegistry;
use Magento\Customer\Model\Customer;
use Magento\Framework\Stdlib\StringUtils as StringHelper;
use Magento\Framework\App\Config\ScopeConfigInterface;
use Symfony\Component\Console\Output\OutputInterface;
use Magento\Framework\App\State as AppState;

/**
 * Class ChangePassword
 * @package DigitalPianism\ChangePassword\Console\Command
 */
class ChangePassword extends Command
{

    /**#@+
     * Data keys
     */
    const KEY_CUSTOMER_ID = 'customer-id';
    const KEY_CUSTOMER_PASSWORD = 'customer-password';

    /**
     * @var CustomerRegistry
     */
    private $_customerRegistry;

    /**
     * @var Customer
     */
    private $_customer;

    /**
     * @var StringHelper
     */
    private $_stringHelper;

    /**
     * @var ScopeConfigInterface
     */
    private $_scopeConfig;

    /**
     * @var AppState
     */
    private $_appState;

    /**
     * @param CustomerRegistry $customerRegistry
     * @param StringHelper $stringHelper
     * @param ScopeConfigInterface $scopeConfig
     * @param AppState $appState
     */
    public function __construct(
        CustomerRegistry $customerRegistry,
        StringHelper $stringHelper,
        ScopeConfigInterface $scopeConfig,
        AppState $appState
    ) {
        $this->_appState = $appState;
        $this->_scopeConfig = $scopeConfig;
        $this->_stringHelper = $stringHelper;
        $this->_customerRegistry = $customerRegistry;
        parent::__construct();
    }

    /**
     * Initialization of the command
     *
     * @return void
     */
    protected function configure()
    {
        $this->setName('customer:changepassword')
            ->setDescription('Change customer password')
            ->setDefinition($this->getOptionsList());
        parent::configure();
    }

    /**
     * Get list of arguments for the command
     *
     * @return InputOption[]
     */
    public function getOptionsList()
    {
        return [
            new InputOption(self::KEY_CUSTOMER_ID, null, InputOption::VALUE_REQUIRED, '(Required) Customer ID'),
            new InputOption(self::KEY_CUSTOMER_PASSWORD, null, InputOption::VALUE_REQUIRED, '(Required) Customer password')
        ];
    }

    /**
     * {@inheritdoc}
     */
    protected function execute(InputInterface $input, OutputInterface $output)
    {
        $this->_appState->setAreaCode('adminhtml');
        $errors = $this->validate($input);
        if ($errors) {
            $output->writeln('<error>' . implode('</error>' . PHP_EOL .  '<error>', $errors) . '</error>');
            // we must have an exit code higher than zero to indicate something was wrong
            return \Magento\Framework\Console\Cli::RETURN_FAILURE;
        }
        $this->_customer
            ->changePassword($input->getOption(self::KEY_CUSTOMER_PASSWORD))
            ->save();

        $output->writeln(
            '<info>Password for customer #' . $input->getOption(self::KEY_CUSTOMER_ID) . ' has been successfully changed</info>'
        );
    }

    /**
     * Check if all admin options are provided
     *
     * @param InputInterface $input
     * @return string[]
     */
    public function validate(InputInterface $input)
    {
        $errors = [];

        try {
            $this->checkPasswordStrength($input->getOption(self::KEY_CUSTOMER_PASSWORD));
            /** @var Customer $customer */
            $this->_customer = $this->_customerRegistry->retrieve($input->getOption(self::KEY_CUSTOMER_ID));
        } catch (Exception $e) {
            $errors[] = $e->getMessage();
        }

        return $errors;
    }

    /**
     * Make sure that password complies with minimum security requirements.
     *
     * @param string $password
     * @throws \Magento\Framework\Exception\InputException
     */
    protected function checkPasswordStrength($password)
    {
        $length = $this->_stringHelper->strlen($password);
        if ($length > \Magento\Customer\Model\AccountManagement::MAX_PASSWORD_LENGTH) {
            throw new \Magento\Framework\Exception\InputException(
                __(
                    'Please enter a password with at most %1 characters.',
                    \Magento\Customer\Model\AccountManagement::MAX_PASSWORD_LENGTH
                )
            );
        }
        $configMinPasswordLength = $this->getMinPasswordLength();
        if ($length < $configMinPasswordLength) {
            throw new \Magento\Framework\Exception\InputException(
                __(
                    'Please enter a password with at least %1 characters.',
                    $configMinPasswordLength
                )
            );
        }
        if ($this->_stringHelper->strlen(trim($password)) != $length) {
            throw new \Magento\Framework\Exception\InputException(__('The password can\'t begin or end with a space.'));
        }

        $requiredCharactersCheck = $this->makeRequiredCharactersCheck($password);
        if ($requiredCharactersCheck !== 0) {
            throw new \Magento\Framework\Exception\InputException(
                __(
                    'Minimum of different classes of characters in password is %1.' .
                    ' Classes of characters: Lower Case, Upper Case, Digits, Special Characters.',
                    $requiredCharactersCheck
                )
            );
        }
    }

    /**
     * Retrieve minimum password length
     *
     * @return int
     */
    protected function getMinPasswordLength()
    {
        return $this->_scopeConfig->getValue(\Magento\Customer\Model\AccountManagement::XML_PATH_MINIMUM_PASSWORD_LENGTH);
    }

    /**
     * Check password for presence of required character sets
     *
     * @param string $password
     * @return int
     */
    protected function makeRequiredCharactersCheck($password)
    {
        $counter = 0;
        $requiredNumber = $this->_scopeConfig->getValue(\Magento\Customer\Model\AccountManagement::XML_PATH_REQUIRED_CHARACTER_CLASSES_NUMBER);
        $return = 0;

        if (preg_match('/[0-9]+/', $password)) {
            $counter ++;
        }
        if (preg_match('/[A-Z]+/', $password)) {
            $counter ++;
        }
        if (preg_match('/[a-z]+/', $password)) {
            $counter ++;
        }
        if (preg_match('/[^a-zA-Z0-9]+/', $password)) {
            $counter ++;
        }

        if ($counter < $requiredNumber) {
            $return = $requiredNumber;
        }

        return $return;
    }
}

Để kích hoạt mô-đun:

php bin/magento setup:upgrade
php bin/magento module:enable DigitalPianism_ChangePassword

Để dùng nó:

php bin/magento customer:changepassword --customer-id=3 --customer-password=mynewpassword

Ở đâu:

  • 3 là một ví dụ về id khách hàng
  • mynewpassword là một ví dụ về mật khẩu khách hàng mới

@ Raphael, Cảm ơn ví dụ đơn giản và thẳng thắn .. làm việc như mong đợi.
Krishna ijjada

1
Cái này nên có trong n98-magerun2.phar ! ;)
7ochem

Tôi nhận được mã vùng không được đặt trong khi chạy cmd. Xin vui lòng giúp đỡ.
Kowsigan Atsayam
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.