CONTATTACI

Guide per aspiranti programmatori

schermo di un pc che proietta il video tutorial di un developer
Lezione 33 / 33

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 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.

Contattaci senza impegno per informazioni sul corso

Pagamento rateale

Valore della rata: A PARTIRE DA 115 €/mese.

Esempio di finanziamento 

Importo finanziato: € 2440 in 24 rate da € 115 – TAN fisso 9,55% TAEG 12,57% – importo totale del credito € 2841.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

*In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Pagamento rateale

Valore della rata: A PARTIRE DA 210 €/mese.

Esempio di finanziamento  

Importo finanziato: € 4500 in 24 rate da € 210,03 – TAN fisso 9,68% TAEG 11,97% – importo totale del credito € 5146,55.

Il costo totale del credito comprende: interessi calcolati al TAN indicato, oneri fiscali (imposta di bollo sul contratto 16,00 euro*) addebitati sulla prima rata, costo mensile di gestione pratica € 3,90, spesa di istruttoria € 0,00, spesa per invio rendicontazione periodica cartacea € 0,98 (o spesa per invio rendicontazione periodica cartacea € 0,00), imposta di bollo su rendicontazione periodica € 0,00. Modalità di rimborso obbligatoria: addebito diretto su c/c. La scadenza delle rate è determinata dal giorno della liquidazione del contratto; la data di scadenza delle rate è prevista il giorno 15 del mese. L’importo di ciascuna rata comprende una quota di capitale crescente e interessi decrescente secondo un piano di ammortamento “alla francese”. Offerta valida dal 01/01/2024 al 31/12/2024.

Messaggio pubblicitario con finalità promozionale. Per le informazioni precontrattuali richiedere sul punto vendita il documento “Informazioni europee di base sul credito ai consumatori” (SECCI) e copia del testo contrattuale. Salvo approvazione di Sella Personal Credit S.p.A. Aulab S.r.l. opera quale intermediario del credito NON in esclusiva.

* In fase di richiesta del finanziamento verrà proposta la facoltà di selezionare, in alternativa all’imposta di bollo sul contratto di 16,00 euro, l’imposta sostitutiva, pari allo 0,25% dell’importo finanziato.

Contattaci senza impegno per informazioni sul corso

Scopriamo insieme se i nostri corsi fanno per te. Compila il form e aspetta la chiamata di uno dei nostri consulenti.