
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…


Vuoi avviare una nuova carriera o fare un upgrade?
Trova il corso Digital & Tech più adatto a te nel nostro catalogo!
- Server locale con XAMPP
- Come installare XAMPP
- Come configurare XAMPP
- Gestione del Database con phpMyAdmin
- Che cos’è Composer e il suo ruolo in Symfony
- Come installare e come configurare Composer
- Gestione delle dipendenze con Composer
- Autoloading con Composer
- Scripts e Comandi Personalizzati con Composer
- Come configurare Visual Studio Code
- Ambiente di sviluppo Symfony remoto (Editor online 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
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
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.
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:
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).
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
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:
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.
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.
CONTENUTI GRATUITI IN EVIDENZA
Guide per aspiranti programmatori 👨🏻🚀
Vuoi muovere i primi passi nel Digital e Tech? Abbiamo preparato alcune guide per aiutarti a orientarti negli ambiti più richiesti oggi.