Класс SelfValidatingPassport
Класс SelfValidatingPassport наследуется от класса Passport
и создаёт паспорт аутентификации, который сразу считается валидным.
Обычный паспорт требует наличия бейджей проверки подлинности,
например PasswordCredentials или CsrfTokenBadge.
Класс SelfValidatingPassport снимает это требование:
аутентификатор сам подтверждает личность пользователя,
поэтому дополнительные бейджи проверки не нужны.
Первым параметром передаётся бейдж пользователя UserBadge,
вторым - массив дополнительных бейджей.
Синтаксис
new SelfValidatingPassport(UserBadge $userBadge, array $badges = [])
Пример
Давайте создадим паспорт с самостоятельной проверкой для уже загруженного пользователя:
<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
class ApiAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->headers->has('X-AUTH-TOKEN');
}
public function authenticate(Request $request): SelfValidatingPassport
{
$token = $request->headers->get('X-AUTH-TOKEN');
$userBadge = new UserBadge($token, function (string $token): User {
return new User('abcde');
});
return new SelfValidatingPassport($userBadge);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
return null;
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
return new Response('auth failed', Response::HTTP_UNAUTHORIZED);
}
}
?>
Результат выполнения кода при наличии заголовка X-AUTH-TOKEN:
"auth success"
Пример
Давайте добавим к паспорту бейдж RememberMeBadge
для поддержки функции «запомнить меня»:
<?php
namespace App\Security;
use App\Entity\User;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Exception\AuthenticationException;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\RememberMeBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
class ApiAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->headers->has('X-AUTH-TOKEN');
}
public function authenticate(Request $request): SelfValidatingPassport
{
$token = $request->headers->get('X-AUTH-TOKEN');
$userBadge = new UserBadge($token, function (string $token): User {
return new User('abcde');
});
$rememberMeBadge = new RememberMeBadge();
return new SelfValidatingPassport($userBadge, [$rememberMeBadge]);
}
public function onAuthenticationSuccess(Request $request, TokenInterface $token, string $firewallName): ?Response
{
return new Response('auth success');
}
public function onAuthenticationFailure(Request $request, AuthenticationException $exception): ?Response
{
return new Response('auth failed', Response::HTTP_UNAUTHORIZED);
}
}
?>
Результат выполнения кода при наличии заголовка X-AUTH-TOKEN:
"auth success"
Смотрите также
-
класс
Passport,
который является базовым классом паспорта аутентификации -
класс
UserBadge,
который передаёт пользователя в паспорт -
класс
RememberMeBadge,
который включает функцию «запомнить меня» -
метод
addBadge,
который добавляет бейдж в паспорт