Come implementare l’autenticazione utente in Symfony | Aulab

GUIDE PER ASPIRANTI PROGRAMMATORI

Come implementare l’autenticazione utente in Symfony

L‘autenticazione utente è un processo critico in qualsiasi applicazione web che gestisce dati sensibili o che fornisce contenuti personalizzati. Si tratta del meccanismo attraverso il quale un sistema verifica l’identità di un utente per assicurarsi che sia effettivamente chi sostiene di essere. Questo processo è fondamentale per garantire la sicurezza, la privacy e l‘integrità dei…

Lezione 33 / 33
Enza Neri
Immagine di copertina

Vuoi avviare una nuova carriera o fare un upgrade?

Trova il corso Digital & Tech più adatto a te nel nostro catalogo!

L‘autenticazione utente è un processo critico in qualsiasi applicazione web che gestisce dati sensibili o che fornisce contenuti personalizzati. Si tratta del meccanismo attraverso il quale un sistema verifica l’identità di un utente per assicurarsi che sia effettivamente chi sostiene di essere. Questo processo è fondamentale per garantire la sicurezza, la privacy e l‘integrità dei dati.

In Symfony, il processo di autenticazione è supportato da una serie di tool e utility che ne semplificano l’implementazione garantendo, in ogni caso, un alto tasso di personalizzazione. Partiamo dall’installazione del pacchetto security di Symfony che fornisce tutte le funzionalità di autenticazione e autorizzazione utili alla sicurezza di una web-application:

composer require symfony/security-bundle

Symfony Flex si occuperà di creare un file di configurazione chiamato security.yaml.

L’entità Utente in Symfony

Ora procediamo con la creazione della Entity Utente. Questa è una classe speciale che implementa la classe UserInterface del componente security di Symfony. Per crearla, facciamoci aiutare da MakerBundle:

php bin/console make:user

creazione modello user da console

Come puoi vedere, la console richiede il nome della classe (di default User), se i dati degli utenti vogliono essere memorizzati sul database tramite il mapping di Doctrine, la proprietà che dovrà essere l’identificativo univoco di ogni utente e, infine, se la password dovrà essere gestita da Symfony o da un sistema terzo. 

Ecco il codice sorgente della classe Utente appena generata:

<?php

namespace App\Entity;

use App\Repository\UtenteRepository;
use Doctrine\ORM\Mapping as ORM;
use Symfony\Component\Security\Core\User\PasswordAuthenticatedUserInterface;
use Symfony\Component\Security\Core\User\UserInterface;

#[ORM\Entity(repositoryClass: UtenteRepository::class)]
class Utente implements UserInterface, PasswordAuthenticatedUserInterface
{
    #[ORM\Id]
    #[ORM\GeneratedValue]
    #[ORM\Column]
    private ?int $id = null;

    #[ORM\Column(length: 180, unique: true)]
    private ?string $email = null;

    #[ORM\Column]
    private array $roles = [];

    /**
     * @var string The hashed password
     */
    #[ORM\Column]
    private ?string $password = null;

    public function getId(): ?int
    {
        return $this->id;
    }

    public function getEmail(): ?string
    {
        return $this->email;
    }

    public function setEmail(string $email): static
    {
        $this->email = $email;

        return $this;
    }

    /**
     * A visual identifier that represents this user.
     *
     * @see UserInterface
     */
    public function getUserIdentifier(): string
    {
        return (string) $this->email;
    }

    /**
     * @see UserInterface
     */
    public function getRoles(): array
    {
        $roles = $this->roles;
        // guarantee every user at least has ROLE_USER
        $roles[] = 'ROLE_USER';

        return array_unique($roles);
    }

    public function setRoles(array $roles): static
    {
        $this->roles = $roles;


        return $this;
    }

    /**
     * @see PasswordAuthenticatedUserInterface
     */
    public function getPassword(): string
    {
        return $this->password;
    }

    public function setPassword(string $password): static
    {
        $this->password = $password;

        return $this;
    }

    /**
     * @see UserInterface
     */
    public function eraseCredentials(): void
    {
        // If you store any temporary, sensitive data on the user, clear it here
        // $this->plainPassword = null;
    }
}

Inoltre, è stato anche aggiornato il file /src/config/packages/security.yaml con le informazioni sulla classe Utente:

  providers:
        # used to reload user from session & other features (e.g. switch_user)
        app_user_provider:
            entity:
                class: App\Entity\Utente
                property: email

Come registrare gli utenti sul sistema in Symfony

Prima di effettuare l’accesso al sistema è necessario aggiungere un utente sul nostro database. Tipicamente, nell’ambito di una web-app, la registrazione avviene tramite un form contenente una serie di campi quali e-mail/username e password. Tale form può essere creato manualmente oppure attraverso la generazione automatica con MakerBundle. Inoltre, grazie al bundle VerifyEmailBundle è possibile anche istanziare un processo automatico di verifica e-mail tramite un URL signed. Installiamo questo bundle e, poi, procediamo alla creazione del form di registrazione con il comando make:

composer require symfonycasts/verify-email-bundle
php bin/console make:registration-form

autenticazione symfony

autenticazione symfony

Il comando make:registration-form ha:

  • generato il controller per la gestione delle route previste per il processo di registrazione utente
  • generato la classe form con i campi e-mail e password
  • generato il template Twig per la visualizzazione del form
  • generato la classe EmailVerifier con il processo di verifica e-mail
  • generato il template Twig dell’e-mail di verifica
  • aggiornato la classe utente con i metodi per la verifica dell’e-mail

Accediamo alla route register per visualizzare il form di registrazione utente.

form registrazione

Una volta compilati i campi presenti nel form e premuto “Register” viene inviata una e-mail all’indirizzo specificato nel campo Email con il seguente messaggio:

messaggio conferma mail

Notiamo, all’interno del corpo della e-mail, il link per la conferma dell’indirizzo. Premendo tale link l’applicazione verificherà l’utente. 

Accediamo al database tramite phpMyAdmin ed esploriamo la tabella “utente”. Notiamo che è stato inserito un nuovo record, con l’hash della password compilata nel form di registrazione e il flag is_verified a true (valore 1).

autenticazione symfony

Come gestire l’accesso degli utenti al sistema in Symfony

Ora che abbiamo aggiunto un nuovo utente al nostro sistema, possiamo procedere con lo step successivo, ovvero l’accesso tramite autenticazione con e-mail e password.

Per la generazione del form di login utilizziamo il comando make:auth:

php bin/console make:auth

comando make auth

Selezioniamo lo stile di autenticazione “Login form authenticator” e confermiamo le opzioni successive per generare la classe SecurityController che conterrà le route /login e /logout.

Accediamo, quindi, tramite browser all’URL symfony-test.local/login:

form login

Inseriamo e-mail e password dell’utente creato precedentemente e premiamo sul pulsante “Sign in”. Se i dati inseriti sono corretti, il sistema effettuerà il redirect verso la route impostata e attiverà la sessione utente. Accediamo al Profiler per verificare l’utente loggato a sistema.

login utente

Dalla schermata in alto, notiamo come sia presente un token che definisce la sessione utente del nostro account personale.

Tutti i template Twig generati in automatico con MakerBundle possono essere personalizzati per adattare i form allo stile del progetto web specifico.

Sei indeciso sul percorso? 💭

Parliamone! Scrivici su Whatsapp e risponderemo a tutte le tue domande per capire quale dei nostri corsi è il più adatto alle tue esigenze.

Oppure chiamaci al 800 128 626