Cómo iniciar sesión (autenticar) manualmente un usuario registrado en Symfony 5

Si seguiste nuestro artículo sobre cómo crear un formulario de registro en su aplicación Symfony 5 utilizando el componente de seguridad predeterminado de Symfony, probablemente estés pensando en este momento, ¿cómo diablos puedo iniciar sesión automáticamente con el usuario que acaba de registrarse en mi aplicación automáticamente? En este breve artículo, te explicaré cómo iniciar sesión fácilmente con cualquier usuario de forma manual en tu aplicación Symfony 5.

A. Iniciar sesión con un usuario registrado recientemente

La primera situación que encontrarás para iniciar sesión como usuario automáticamente, es justo después del paso de registro en su aplicación. Esto suele ocurrir en la acción de registro de su controlador de seguridad. Puedes autenticar fácilmente a su usuario devolviendo como respuesta el resultado del autenticador (onAuthenticationSuccess):

<?php

// src/Controller/SecurityController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\Security\Core\Encoder\UserPasswordEncoderInterface;
use App\Form\RegistrationFormType;
use App\Entity\User;
use App\Security\LoginFormAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;

class SecurityController extends AbstractController
{
    /**
     * Registra un nuevo usuario
     * 
     * @param Request $request
     * @param UserPasswordEncoderInterface $passwordEncoder
     * @param LoginFormAuthenticator $loginAuthenticator
     * @param GuardAuthenticatorHandler $guard
     * @return Response
     */
    public function register(
        Request $request, 
        UserPasswordEncoderInterface $passwordEncoder,
        LoginFormAuthenticator $loginAuthenticator,
        GuardAuthenticatorHandler $guard
    ): Response
    {
        $user = new User();
        $form = $this->createForm(RegistrationFormType::class, $user);
        $form->handleRequest($request);
        
        if ($form->isSubmitted() && $form->isValid()) {
            // codificar la contraseña plana
            $user->setPassword(
                $passwordEncoder->encodePassword(
                    $user,
                    $form->get('plainPassword')->getData()
                )
            );

            $entityManager = $this->getDoctrine()->getManager();
            $entityManager->persist($user);
            $entityManager->flush();
            
             // Manejar al usuario como si acabara de iniciar sesión
             // después de validar al usuario y guardarlo en la base de datos
             // autenticar al usuario y usar onAuthenticationSuccess en el autenticador
            return $guard->authenticateUserAndHandleSuccess(
                $user,
                $request,
                $loginAuthenticator,
                'main'
            );
        }

        return $this->render('security/register.html.twig', [
            'registrationForm' => $form->createView(),
        ]);
    }
}

Esto iniciará automáticamente la sesión de su usuario, siguiendo el firewall principal actual de tu aplicación. 

B. Iniciar sesión en cualquier entidad de usuario después del evento onAuthenticationSuccess del LoginFormAuthenticator 

Por otro lado, si todo lo que estás buscando es autenticar una entidad/objeto de usuario específico que puedes obtener de tu base de datos, el siguiente fragmento corto te mostrará cómo hacerlo conservando lo que la aplicación debería hacer después de cada autenticación exitosa (método onAuthenticationSuccess de tu autenticador):

<?php

// src/Controller/SecurityController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\User;
use App\Security\LoginFormAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;

class SecurityController extends AbstractController
{
    public function example(
        Request $request, 
        LoginFormAuthenticator $loginAuthenticator,
        GuardAuthenticatorHandler $guard
    ): Response
    {
        // Encuentra algún usuario en su aplicación, en este ejemplo, el que tiene ID # 1
        $user = $this->getDoctrine()->getManager()->getRepository(User::class)->find(1);
        
        // Autentica al usuario y sigue los pasos de LoginFormAuthenticator (¿redirigir a la página de índice que es común tal vez?)
        return $guard->authenticateUserAndHandleSuccess(
            $user,
            $request,
            $loginAuthenticator,
            'main'
        );
    }
}

C. Iniciar sesión en cualquier entidad de usuario

Finalmente, la otra opción es simplemente iniciar sesión en el usuario, sin embargo ignorando la función  onAuthenticationSuccess de tu LoginFormAuthenticator, razón por la cual por defecto redirecciona normalmente a la página de inicio de tu proyecto. Use el mismo método authenticateUserAndHandleSuccess, sin embargo, no devuelvas su resultado como respuesta, simplemente llama al método y haz lo que necesites después:

<?php

// src/Controller/SecurityController.php
namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\Request;
use App\Entity\User;
use App\Security\LoginFormAuthenticator;
use Symfony\Component\Security\Guard\GuardAuthenticatorHandler;

class SecurityController extends AbstractController
{
    public function example(
        Request $request, 
        LoginFormAuthenticator $loginAuthenticator,
        GuardAuthenticatorHandler $guard
    ): Response
    {
        // Encuentra algún usuario en su aplicación, en este ejemplo, el que tiene ID # 1
        $user = $this->getDoctrine()->getManager()->getRepository(User::class)->find(1);
        
        // Autenticar usuario
        $guard->authenticateUserAndHandleSuccess(
            $user,
            $request,
            $loginAuthenticator,
            'main'
        );
        
        // ¡En este punto, el usuario ya está autenticado!
        
        // puedes redirigir al usuario a otra página
        // ejecutar otra lógica o lo que necesites ;)
        return $this->redirectToRoute("articles_index");
    }
}

Que te diviertas ❤️!

Esto podria interesarte

Conviertete en un programador más sociable