Метод start класса AbstractAuthenticator
Метод start класса AbstractAuthenticator запускает
процесс аутентификации. Он вызывается автоматически системой
безопасности Symfony, когда нужно аутентифицировать пользователя.
Метод принимает объект Request и должен вернуть объект
Passport либо null. Если возвращается null,
аутентификация пропускается. Возвращённый Passport
передаётся в метод authenticate.
Синтаксис
public function start(Request $request): ?Passport
Пример
Давайте создадим аутентификатор, который извлекает токен из
заголовка Authorization и формирует паспорт:
<?php
namespace App\Security;
use App\Security\UserProvider;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\SelfValidatingPassport;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
class ApiTokenAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->headers->has('Authorization');
}
public function start(Request $request): ?Passport
{
$token = $request->headers->get('Authorization');
if ($token === null) {
return null;
}
return new SelfValidatingPassport(
new UserBadge($token)
);
}
}
?>
Пример
Давайте вернём паспорт с пользовательскими данными из формы входа:
<?php
namespace App\Security;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Http\Authenticator\AbstractAuthenticator;
use Symfony\Component\Security\Http\Authenticator\Passport\Passport;
use Symfony\Component\Security\Http\Authenticator\Passport\PasswordCredentials;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\UserBadge;
use Symfony\Component\Security\Http\Authenticator\Passport\Badge\CsrfTokenBadge;
class FormAuthenticator extends AbstractAuthenticator
{
public function supports(Request $request): ?bool
{
return $request->isMethod('POST')
&& $request->attributes->get('_route') === 'app_login';
}
public function start(Request $request): ?Passport
{
$email = $request->request->get('email');
$password = $request->request->get('password');
$csrfToken = $request->request->get('_csrf_token');
return new Passport(
new UserBadge($email),
new PasswordCredentials($password),
[
new CsrfTokenBadge('authenticate', $csrfToken),
]
);
}
}
?>
Пример
Давайте посмотрим, как система безопасности вызывает метод
start и что возвращается в результате:
<?php
namespace App\Controller;
use App\Security\ApiTokenAuthenticator;
use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
class SecurityController extends AbstractController
{
public function check(ApiTokenAuthenticator $authenticator, Request $request): Response
{
$passport = $authenticator->start($request);
if ($passport === null) {
return new Response('no passport');
}
return new Response('passport created');
}
}
?>
Результат выполнения кода при наличии заголовка
Authorization:
"passport created"
Смотрите также
-
класс
AbstractAuthenticator,
который является базой для аутентификаторов -
метод
authenticate,
который получает паспорт и возвращает пользователя -
класс
Passport,
который хранит данные аутентификации -
класс
SelfValidatingPassport,
который создаёт паспорт без пароля