วิธีเปลี่ยนรหัสผ่านลูกค้าอย่างรวดเร็วใน Magento 2


11

ใน Magento 1 จากการกำหนดค่าผู้ดูแลระบบในส่วนจัดการลูกค้าเราสามารถอัพเดต / เปลี่ยนรหัสผ่านใหม่ของลูกค้าได้อย่างง่ายดาย

ใน Magento 2 การส่งการรีเซ็ตรหัสผ่านด้วยอีเมลเท่านั้นจะช่วยได้ แต่ไม่เสมอไป นี่อาจเป็นคำถามง่าย ๆ แต่บางครั้งมันอาจช่วยประหยัดเวลาได้มาก

  • มีวิธีง่าย ๆ ในการเปลี่ยนรหัสผ่านของลูกค้าใน Magento 2 หรือไม่?

  • มีวิธีใดบ้างจากฐานข้อมูลที่เราสามารถเปลี่ยนรหัสผ่านด้วยประเภทการเข้ารหัสได้โดยตรง?

ความช่วยเหลือจะได้รับการชื่นชม


ต้องการเปลี่ยนสำหรับผู้ใช้ที่เป็นผู้ดูแลระบบหรือไม่
Suresh Chikani

ดูmagento.stackexchange.com/questions/137555/ด้วย เป็นไปได้ซ้ำไหม มีเพียงหนึ่งที่ระบุอย่างชัดเจนเพื่อเปลี่ยนรหัสผ่านลูกค้า "ผ่านฐานข้อมูล" ...
7ochem

คำตอบ:


8

สำหรับวิธีที่ง่ายในการเปลี่ยนรหัสผ่านสำหรับลูกค้าที่มีอยู่คุณสามารถนำเข้าข้อมูลไฟล์ CSV ของลูกค้าของเขตข้อมูล id อีเมลและรหัสผ่านของลูกค้าปัจจุบัน คุณสามารถให้รหัสผ่านที่คุณต้องการเปลี่ยนและpassword_hashควรจะว่างเปล่า

โปรดดู sceenshots ด้านล่าง:

ป้อนคำอธิบายรูปภาพที่นี่ป้อนคำอธิบายรูปภาพที่นี่


13

การสร้างคำสั่งคอนโซลจะเป็นทางออกที่ดีที่สุดของคุณในความคิดของฉัน

แก้ไข: โมดูลมีให้ที่นี่หากคุณต้องการ: https://github.com/digitalpianism/changepassword

นี่คือโมดูลที่จะทำ (ทดสอบเฉพาะใน 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;
    }
}

วิธีเปิดใช้งานโมดูล:

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

วิธีใช้:

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

ที่ไหน:

  • 3เป็นตัวอย่างของรหัสลูกค้า
  • mynewpasswordเป็นตัวอย่างของรหัสผ่านลูกค้าใหม่

@ Raphael ขอบคุณสำหรับตัวอย่างที่ง่ายและตรง .. ทำงานตามที่คาดไว้
กฤษณะ ijjada

1
อันนี้ควรอยู่ในn98-magerun2.phar ! ;)
7ochem

ฉันได้รับรหัสพื้นที่ไม่ได้ตั้งค่าในขณะที่เรียกใช้ cmd กรุณาช่วย.
Kowsigan Atsayam
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.