Skip to content

Autenticación de usuarios

Consultar la siguiente documentación de Symfony donde se explica el tema con más detallehttps://symfony.com/doc/6.4/security.html#form-login

Una vez tengamos la table de usuario y la gestión de como se crean podemos continuar con la configuración de la sesión de usuarios y como estos se pueden autenticar.

Debemos crear un controlador Login para gestionar el inicio de sesión y el cierre de sesión. Tendría un aspecto parecido al siguiente.

namespace App\Controller;

use Symfony\Bundle\FrameworkBundle\Controller\AbstractController;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\Routing\Attribute\Route;
use Symfony\Component\Security\Http\Authentication\AuthenticationUtils;

class LoginController extends AbstractController
{
    #[Route('/login', name: 'login')]
    public function index(AuthenticationUtils $authenticationUtils): Response
    {
        $error = $authenticationUtils->getLastAuthenticationError();
        $lastUsername = $authenticationUtils->getLastUsername();

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

    #[Route('/logout', name: 'app_logout')]
    public function logout(AuthenticationUtils $authenticationUtils)
    {
        // Está función se debe quedar vacia
    }
}

Preparamos la vista asociada al controlador

{% extends 'base.html.twig' %}

{% block title %}Hello Login{% endblock %}

{% block body %}
    {% if error %}
        <div>{{ error.messageKey|trans(error.messageData, 'security') }}</div>
    {% endif %}

    <form action="{{ path('login') }}" method="post">
        <label for="username">Email:</label>
        <input type="text" id="username" name="_username" value="{{ last_username }}" required>

        <label for="password">Password:</label>
        <input type="password" id="password" name="_password" required>

        <input type="hidden" name="_target_path" value="/">

        <button type="submit">login</button>
    </form>
{% endblock %}

y finalmente debemos configurar el firewall (archivo de configuración segurity.yaml) para indicarle las rutas correspondientes al login y al logout, agregando los campos form_login y logout debajo de main.

    # https://symfony.com/doc/current/security.html#registering-the-user-hashing-passwords
    password_hashers:
        Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface: 'auto'
    # https://symfony.com/doc/current/security.html#loading-the-user-the-user-provider
    providers:
        # used to reload user from session & other features (e.g. switch_user)
        app_user_provider:
            entity:
                class: App\Entity\User
                property: email
    firewalls:
        dev:
            pattern: ^/(_(profiler|wdt)|css|images|js)/
            security: false
        main:
            lazy: true
            provider: app_user_provider
            form_login:
                login_path: login
                check_path: login
            logout:
                path: app_logout

A la hora de probar que todo funcione bien, en la página web estando en modo desarrollo se nos indicara en la barra inferior si se ha iniciado sesión y con que usuario.