La quasi totalità delle applicazioni Web necessitano di proteggere le pagine attraverso autenticazione con almeno username e password. Anche il nostro social network ha bisogno di servire informazioni diverse in base all’utente che accede. Per questa ragione iniziamo a introdurre il componente Security di Symfony e a inserire la nostra pagina di login.
Lanciamo il seguente comando per installare il componente:
$ composer require symfony/security-bundle
In una situazione normale andremmo a creare il modello dell’utente e il relativo repository per recuperare i dati dal database ma, per adesso, concentriamoci su come funziona il sistema di autenticazione inserendo username e password dell’utente direttamente nella configurazione di Symfony.
Questa impostazione cambierà nelle prossime lezioni ma visto che ancora non abbiamo introdotto alcuni concetti limitiamoci a recuperare le informazioni di login in questo modo.
Per fare ciò useremo il MemoryProvider
di Symfony che permette di recuperare le informazioni dell’utente direttamente dalle impostazioni salvate nella configurazione. Apriamo il file app/config/packages/security.yml
e aggiungiamo all’inizio del file il seguente codice:
encoders:
Symfony\Component\Security\Core\User\User: 'auto'
Il componente Security mette a disposizione una classe User
di base che per adesso è sufficiente per le nostre esigenze. La regola precedente definisce l’algoritmo che verrà utilizzato per encodare la password. Ora possiamo aprire il terminale e lanciare il comando:
$ php bin/console security:encode-password
Verrà restituita l'hash di una password, teniamola da parte e aggiungiamo all’interno del security.yml
la seguente impostazione:
providers:
backend_users:
memory:
users:
ryan: { password: '<hash>', roles: ['ROLE_USER'] }
in cui andiamo a sostituire il placeholder con l’hash ottenuto. Questa impostazione consentirà di effettuare il login con nome utente ryan e la password selezionata. Nel codice all’interno del tag login-in-memory
la password è helloworld.
A questo punto possiamo utilizzare il MakerBundle
per creare il form di login, il relativo controller e l’authenticator. Lanciamo il comando con le impostazioni come di seguito:
$ php bin/console make:auth
What style of authentication do you want? [Empty authenticator]:
[0] Empty authenticator
[1] Login form authenticator
> 1
The class name of the authenticator to create (e.g. AppCustomAuthenticator):
> LoginFormAuthenticator
Choose a name for the controller class (e.g. SecurityController) [SecurityController]:
> SecurityController
Enter the User class that you want to authenticate (e.g. App\Entity\User) []:
> Symfony\Component\Security\Core\User\User
Do you want to generate a '/logout' URL? (yes/no) [yes]:
> yes
created: src/Security/LoginFormAuthenticator.php
updated: config/packages/security.yaml
created: src/Controller/SecurityController.php
created: templates/security/login.html.twig
Success!
Next:
- Customize your new authenticator.
- Finish the redirect "TODO" in the App\Security\LoginFormAuthenticator::onAuthenticationSuccess() method.
- Review App\Security\LoginFormAuthenticator::getUser() to make sure it matches your needs.
- Review & adapt the login template: templates/security/login.html.twig.
I file creati dal comando sono sufficienti per una pagina di login funzionante. Se proviamo a loggarci nella pagina
http://kvak.local/login
con username ryan e password helloworld riceveremo l'eccezione
# TODO: provide a valid redirect inside /var/www/kvak/src/Security/LoginFormAuthenticator.php
E' in realtà una buona notizia perché indica che tutto sta funzionando e che dobbiamo seguire i consigli del comando precedente.
Per effettuare il logout possiamo dirigerci all’indirizzo
http://kvak.local/logout
Il codice della lezione è disponibile con il tag login-in-memory
all’interno del repository.