如何检查用户在密码重置表单中提供的当前密码是否与 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();
希望这对其他人有帮助:)
我正在尝试在没有电子邮件 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();
希望这对其他人有帮助:)