Класс CsrfTokenBadge
Класс CsrfTokenBadge представляет собой бейдж
паспорта аутентификации, который добавляет
CSRF-токен в процесс проверки подлинности.
Он используется совместно с классом
Passport или SelfValidatingPassport
для защиты форм входа от CSRF-атак.
Первым параметром передаётся идентификатор
CSRF-токена, вторым - значение токена.
Бейдж наследуется от класса
BadgeInterface и реализует метод
getCsrfToken, возвращающий значение токена.
Проверка токена выполняется автоматически
при аутентификации через CsrfTokenManager.
Синтаксис
new CsrfTokenBadge(string $tokenId, string $csrfToken)
Пример
Давайте создадим паспорт с CSRF-бейджем в аутентификаторе:
<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Credentials\PasswordCredentials;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
class LoginAuthenticator extends AbstractAuthenticator
{
public function authenticate(Request $request): Passport
{
$csrfToken = $request->request->get('_csrf_token', '');
return new Passport(
new UserBadge($request->request->get('_username', '')),
new PasswordCredentials($request->request->get('_password', '')),
[
new CsrfTokenBadge('authenticate', $csrfToken),
]
);
}
public function supports(Request $request): ?bool
{
return $request->isMethod('POST') && $request->attributes->get('_route') === 'app_login';
}
public function onAuthenticationSuccess(Request $request, $token, string $firewallName): ?Response
{
return null;
}
public function onAuthenticationFailure(Request $request, $exception): ?Response
{
return null;
}
}
?>
В данном примере создаётся бейдж с идентификатором
'authenticate' и значением токена из запроса.
Если токен не совпадёт с ожидаемым,
аутентификация завершится ошибкой.
Пример
Давайте получим значение CSRF-токена из бейджа:
<?php
namespace App\Security;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
$badge = new CsrfTokenBadge('authenticate', 'abcde');
$res = $badge->getCsrfToken();
echo $res;
?>
Результат выполнения кода:
"abcde"
Смотрите также
-
класс
Passport,
который содержит бейджи аутентификации -
класс
SelfValidatingPassport,
который поддерживает CSRF-бейдж -
метод
addBadge,
который добавляет бейдж в паспорт -
класс
UserBadge,
который идентифицирует пользователя