Как установить токен сессии в Symfony при аутентификации?

Привет

Делаю ajax логин в symfony, столкнулся с тем, что после регистрации не появляется сессия юзера, следовательно всякие запросы по типу:

$request->getSession(); - возвращают null
$request->getUser() - возвращают null
__

Что я сделал:

security.yaml

    firewalls:
        main:
            anonymous: ~
            pattern:    ^/
            http_basic: ~
            provider: our_db_provider

            form_login:
                login_path: index #редиректит сюда, если нет логина
                check_path: login #отрабатывает функцию логина
                success_handler: authentication_handler
                failure_handler: authentication_handler

            logout:
                path: logout
                target: /


Кастомный класс authenticaton_handler

class AuthenticationHandler implements AuthenticationSuccessHandlerInterface,
    AuthenticationFailureHandlerInterface
{
    public function onAuthenticationSuccess(Request $request, TokenInterface $token)
    {
        if ($request->isXmlHttpRequest()) {

            $response = new JsonResponse([
                'reload' => 'reload',
            ]);
            return $response;
        } else {
            $redirect = new RedirectResponse("index");
            return $redirect;
        }
    }


Что я тут делаю. Если форма принимает правильные данные, то у меня срабатывает стандартный механизм логина, который передает управление кастомному логину, который возвращает JSON-ответ, и уже фронт его использует для обновления всего.

Проблема в том, что механизм логина переключается на мой обработчик раньше, чем прописывает все сессии. По идее, я как-то кастомно могу прописать сессию через TokenInterface $token в моем кастомном классе, но я не пойму, как это сделать.

Гугл не дал ответа, там, к сожалению, каша из ответов разной паршивости на все версии symfony.
  • Вопрос задан
  • 216 просмотров
Пригласить эксперта
Ответы на вопрос 1
@Fishernet
Symfony 4
Кастомно можно так (если я вас правильно понял):
use Symfony\Component\Security\Core\Authentication\AuthenticationManagerInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\UsernamePasswordToken;

class SecurityService
{
    private $authenticationManager;
    private $tokenStorage;

    public function __construct(
        AuthenticationManagerInterface $authenticationManager,
        TokenStorageInterface $tokenStorage,
    )
    {
        $this->authenticationManager = $authenticationManager;
        $this->tokenStorage = $tokenStorage;
    }

    
    public function test()
    {
       
        $user = ...;  // entity User
        
        $unauthenticatedToken = new UsernamePasswordToken(
            $user,
            $user->getPlainPassword(),
            'main'
        );

        $authenticatedToken = $this
            ->authenticationManager
            ->authenticate($unauthenticatedToken);

        $this->tokenStorage->setToken($authenticatedToken);
    }
Ответ написан
Комментировать
Ваш ответ на вопрос

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

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