Метод isPasswordValid
Метод isPasswordValid класса UserPasswordHasher
проверяет, соответствует ли пароль в открытом виде
хешу, хранящемуся у пользователя. Первым параметром
передаётся объект пользователя, реализующий
PasswordAuthenticatedUserInterface, вторым -
пароль в открытом виде. Метод возвращает true,
если пароль верный, и false в противном случае.
Чаще всего метод используется в кастомном
аутентификаторе при проверке учётных данных.
Синтаксис
public function isPasswordValid(
PasswordAuthenticatedUserInterface $user,
string $plainPassword
): bool
Пример
Давайте проверим, соответствует ли пароль 'abcde'
хешу пользователя:
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\UserPasswordHasherInterface;
class AuthController extends AbstractController
{
public function check(UserPasswordHasherInterface $hasher): Response
{
$user = new User();
$user->setPassword(
$hasher->hashPassword($user, 'abcde')
);
$res = $hasher->isPasswordValid($user, 'abcde');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
true
Пример
Давайте проверим неверный пароль 'hello'
для того же пользователя:
<?php
namespace App\Controller;
use App\Entity\User;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\UserPasswordHasherInterface;
class AuthController extends AbstractController
{
public function check(UserPasswordHasherInterface $hasher): Response
{
$user = new User();
$user->setPassword(
$hasher->hashPassword($user, 'abcde')
);
$res = $hasher->isPasswordValid($user, 'hello');
return new Response(var_export($res, true));
}
}
?>
Результат выполнения кода:
false
Пример
Давайте используем метод в кастомном аутентификаторе для проверки учётных данных пользователя:
<?php
namespace App\Security;
use App\Repository\UserRepository;
use Symfony\Component\HttpFoundation\JsonResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\PasswordHasher\UserPasswordHasherInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
class ApiAuthenticator
{
public function __construct(
private UserRepository $users,
private UserPasswordHasherInterface $hasher
) {
}
public function authenticate(Request $request): Response
{
$login = $request->get('login');
$password = $request->get('password');
$user = $this->users->findOneBy(['login' => $login]);
if ($user === null) {
throw new AuthenticationException('User not found');
}
if (!$this->hasher->isPasswordValid($user, $password)) {
throw new AuthenticationException('Invalid password');
}
return new JsonResponse(['status' => 'ok']);
}
}
?>
Если пользователь с логином login существует
и пароль совпадает - вернётся JSON '{"status":"ok"}'.
Смотрите также
-
класс
UserPasswordHasher,
который хеширует и проверяет пароли пользователей -
метод
hashPassword,
который создаёт хеш пароля -
интерфейс
PasswordAuthenticatedUserInterface,
который реализует пользователь с паролем -
метод
needsRehash,
который проверяет необходимость перехеширования пароля