Задать вопрос
svisch
@svisch

Как происходит аутентификация в Symfony на примере из документации?

Здравствуйте. Вот пример из оф. документации:

LoginController.php
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class LoginController extends AbstractController
{
    #[Route('/login', name: 'app_login')]
    public function index(AuthenticationUtils $authenticationUtils): Response
    {
            // get the login error if there is one
            $error = $authenticationUtils->getLastAuthenticationError();

            // last username entered by the user
            $lastUsername = $authenticationUtils->getLastUsername();

             return $this->render('login/index.html.twig', [
                         'last_username' => $lastUsername,
                         'error'         => $error,
              ]);
    }
}


class AuthenticationUtils
{
    private RequestStack $requestStack;

    public function __construct(RequestStack $requestStack)
    {
        $this->requestStack = $requestStack;
    }

    public function getLastAuthenticationError(bool $clearSession = true): ?AuthenticationException
    {
        $request = $this->getRequest();
        $authenticationException = null;

        if ($request->attributes->has(Security::AUTHENTICATION_ERROR)) {
            $authenticationException = $request->attributes->get(Security::AUTHENTICATION_ERROR);
        } elseif ($request->hasSession() && ($session = $request->getSession())->has(Security::AUTHENTICATION_ERROR)) {
            $authenticationException = $session->get(Security::AUTHENTICATION_ERROR);

            if ($clearSession) {
                $session->remove(Security::AUTHENTICATION_ERROR);
            }
        }

        return $authenticationException;
    }

    public function getLastUsername(): string
    {
        $request = $this->getRequest();

        if ($request->attributes->has(Security::LAST_USERNAME)) {
            return $request->attributes->get(Security::LAST_USERNAME, '');
        }

        return $request->hasSession() ? $request->getSession()->get(Security::LAST_USERNAME, '') : '';
    }

    /**
     * @throws \LogicException
     */
    private function getRequest(): Request
    {
        $request = $this->requestStack->getCurrentRequest();

        if (null === $request) {
            throw new \LogicException('Request should exist so it can be processed for error.');
        }

        return $request;
    }
}


Ну и в контроллере просто рендерится твиг шаблон, где форма и отправляет ее на тот же маршрут, что и LoginController.
Не понятно где именно идет процесс проверки пользователя и пароля и др. операции. Понимаю, что в компоненте Security где-то скорее всего, но как именно он взаимодействует понять не могу. Возможно как-то через сервисы или конфигурационные файлы. Объясните плиз кто-нибудь на пальцах)
  • Вопрос задан
  • 196 просмотров
Подписаться 1 Средний Комментировать
Решения вопроса 1
@tukreb
Под капотом всё происходит, перехватываются события и симофни в своих компонентах всё это делает.
Но многие предпочитают реализовать свои проверки, чтобы иметь больше контроля. И у симфони есть для этого инструкция.
https://symfony.com/doc/current/security/custom_au...
https://symfony.com/doc/current/security/user_chec...
Вы вообще можете реализовать всё сами, просто прочитай документацию там всё расписано.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы