如何检查用户在密码重置表单中提供的当前密码是否与 Drupal 8 中的散列密码匹配

How do I check if the current password that the user gives in the password reset form matches with the hashed password in Drupal 8

我正在尝试在没有电子邮件 link 的情况下以编程方式在 Drupal 8 中重置用户密码。为此,第一步是检查用户在密码重置表单中输入的密码(普通密码)是否与相应用户的散列密码相匹配。然后保存新密码。

每次我对密码进行哈希处理时,它都会给出不同的值,这是因为它被加盐了。我该如何比较用户在表单中输入的密码与 table.

中的散列密码

这是我控制器中用于检查当前密码的代码:

<?php
/**
* @file
* contains \Drupal\customer_profile\Controller\ProfileUpdateController
*/

 namespace Drupal\customer_profile\Controller;

 use Drupal\Core\Controller\ControllerBase;

 use Symfony\Component\HttpFoundation\JsonResponse;
 use Drupal\Core\Password\PhpassHashedPassword;
 use Drupal\Core\Password\PasswordInterface;

 class ProfileUpdateController extends ControllerBase {

   //$user = User::load(1);
   //$user->setPassword('secret');
   //$pass = $user->save();
   $user =\Drupal\user\Entity\User::load(\Drupal::currentUser()->id());
   $ret = \Drupal\Core\Password\PasswordInterface::check('secret', $user);

   $response->password = $ret;
   return new JsonResponse($response);
  }
 }

在使用 \Drupal\Core\Password\PasswordInterface::check() 方法后,为了比较明文密码和散列密码,我得到这个致命错误:

致命错误:无法静态调用非静态方法 Drupal\Core\Password\PasswordInterface::check(),假设 $this 来自 C:\xampp\htdocs\ijarah\modules\custom\customer_profile\src\Controller\ProfileUpdateController.[=38 中的不兼容上下文=] 第 725 行

在 Drupal 7 中,我们有 user_check_password 用字符串检查密码,user_hash_password 用于散列。 我怎样才能在 Drupal 8 中使用相同的方法。

请帮忙。

好的,解决方案是使用依赖注入,然后使用 check() 方法。这是代码:

<?php    
/**
* @file
* contains \Drupal\customer_profile\Controller\ProfileUpdateController
*/
namespace Drupal\customer_profile\Controller;

use Drupal\Core\Controller\ControllerBase;

use Symfony\Component\HttpFoundation\JsonResponse;
use Drupal\Core\Session\AccountInterface;
use Drupal\Core\DependencyInjection\ContainerInjectionInterface; 
use Symfony\Component\DependencyInjection\ContainerInterface;
use Drupal\Core\Password\PasswordInterface;

 class ProfileUpdateController extends ControllerBase implements ContainerInjectionInterface {

  public function __construct(PasswordInterface $password_hasher, AccountInterface $account) {
   $this->passwordHasher = $password_hasher;
   $this->account = $account;
  }

   public static function create(ContainerInterface $container) {
     return new static(
       $container->get('password'),
       $container->get('current_user')
     );
   }

   public function updatePassword() {
     //global $user;
     $response = new \stdClass();
      //check the plain password with the hashed password from db
     $pass = $this->passwordHasher->check('secret', 'hashed_password_from_db');

     $response->password = $pass;
     // this will return true if the password matches or false vice-versa
     return new JsonResponse($response);
   }
  }
   ?>

检查密码后,我们可以使用

保存新密码
  $user = User::load(1);
  $user->setPassword('new_password_secret');
  $user->save();

希望这对其他人有帮助:)