Метод eraseCredentials
Метод eraseCredentials принадлежит интерфейсу
UserInterface и вызывается Symfony автоматически
после успешной аутентификации пользователя. Его задача -
удалить из объекта пользователя все чувствительные данные,
такие как пароль в открытом виде, чтобы они не хранились
в сессии. Метод не принимает параметров и не возвращает
значения. В современных версиях Symfony (начиная с 6.4)
реализация этого метода необязательна и может быть пустой.
Синтаксис
public function eraseCredentials(): void
Пример
Давайте создадим класс пользователя, реализующий
UserInterface, и переопределим метод
eraseCredentials для очистки поля
plainPassword:
<?php
namespace App\Entity;
use Symfony\Component\Security\Core\User\UserInterface;
class User implements UserInterface
{
private string $username;
private array $roles = [];
private ?string $plainPassword = null;
public function getUserIdentifier(): string
{
return $this->username;
}
public function getRoles(): array
{
return $this->roles;
}
public function eraseCredentials(): void
{
$this->plainPassword = null;
}
}
?>
Результат выполнения метода после аутентификации:
null
Пример
Давайте рассмотрим, как Symfony вызывает этот метод при входе пользователя. Внутри аутентификатора происходит очистка данных автоматически:
<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
class LoginAuthenticator extends AbstractAuthenticator
{
public function authenticate(Request $request): Passport
{
$username = $request->request->get('username');
$password = $request->request->get('password');
return new Passport(
new UserBadge($username),
new PasswordCredentials($password)
);
}
public function onAuthenticationSuccess(
Request $request,
TokenInterface $token,
string $firewallName
): ?RedirectResponse {
$user = $token->getUser();
if ($user instanceof User) {
$user->eraseCredentials();
}
return new RedirectResponse('/dashboard');
}
}
?>
Результат выполнения кода для адреса /login:
Редирект на /dashboard
Смотрите также
-
интерфейс
UserInterface,
который описывает контракт пользователя в Symfony -
метод
getUserIdentifier,
который возвращает уникальный идентификатор пользователя -
метод
getRoles,
который возвращает список ролей пользователя -
интерфейс
PasswordAuthenticatedUserInterface,
который добавляет метод получения пароля