Dopo aver appreso le basi su come Laravel gestisce autenticazioni e autorizzazioni, aggiungiamo ora una gestione utenti basilare ma efficace nella nostra applicazione, Biblios. Le specifiche da implementare sono:
- maschera di login a partire da email e password;
- pannello nella parte alta del sito che mostri il link alla pagina di login (se l'utente non è loggato) o i dati dell'utente loggato;
- pagina di registrazione che utilizzi CAPTCHA per evitare i bot;
- pagina privata dove definire alcuni libri come "preferiti";
- rendere private le pagine di anagrafica già create solo per gli amministratori, identificati da una colonna booleana su database.
All'interno dell'articolo ci soffermeremo sugli aspetti specifici dell'argomento, non verrà invece proposto codice utile allo scopo ma non relativo alla "gestione utenti". A corredo verranno comunque forniti i sorgenti funzionanti dell'applicazione in modo da poter testare il tutto e approfondire le parti non esplicitate nel testo.
Il login
Come primo passo per implementare il login dobbiamo creare una nuova migration che si occupi di modificare il database (per inserire la nuova colonna admin
come da specifiche) e un nuovo seeder per popolare il database con degli utenti di test. Lanciamo quindi
php artisan make:migration update_users_admin
e
php artisan make:seed UserSeeder
e modifichiamo i file appena creati in base alle nostre esigenze.
Una volta modificato e popolato il database possiamo concentrarci sulle prime due specifiche. Iniziamo dalle rotte necessarie che per il momento sono 3:
Route::get('/login', [
'uses' => 'Auth\AuthController@getLogin',
'as' => 'login'
]);
Route::post('/login', [
'uses' => 'Auth\AuthController@postLogin',
'as' => 'login.post'
]);
Route::group(['middleware' => 'auth'], function () {
Route::get('/logout', [
'uses' => 'Auth\AuthController@getLogout',
'as' => 'logout'
]);
});
Da notare come la rotta di logout è inserita in un gruppo con un middleware (auth
) in quanto è privata ed accessibile solo se l'utente è loggato. I controller utilizzati per le rotte sono quelli standard di Laravel.
Dato che abbiamo configurato delle rotte personalizzate rispetto a quelle out-of-the box, dobbiamo configurare l'AuthController
in modo che sappia dove redirigere l'utente. Aggiungiamo quindi queste righe sotto i traits:
protected $redirectPath = '/';
protected $loginPath = '/login';
La prima regola farà si che l'utente una volta loggato venga rediretto alla home, la seconda lo porterà al login nel caso cercasse di accedere a pagine riservate senza permessi.
Ora possiamo concentrarci sulle view. Gli interventi da fare sono due, implementare la pagina login.blade.php
in resources/view/auth
e modificare layout/biblios.blade.php
per aggiungere il pannello nell'header che verrà mostrato in tutte le pagine.
<div class="row">
<div class="col-md-6 pull-right">
@if(Auth::check())
Benvenuto <b>{{ Auth::user()->name }}</b> <a href="{{ route('logout') }}">Logout</a>
@else
<a href="{{ route('login') }}">Login</a>
@endif
</div>
</div>
Se tutto è stato implementato correttamente, dopo queste modifiche saremo in grado di loggarci e di fare logout. Un test ulteriore è provare ad accedere a /logout
da utenti anonimi e verificare che l'applicazione ci rimandi al login.
Registrazione di nuovi utenti
Un login è poco funzionale se non è possibile registrarsi. Implementiamo quindi la terza specifica e aggiungiamo due rotte mappate verso i controller standard di Laravel:
Route::get('/register', [
'uses' => 'Auth\AuthController@getRegister',
'as' => 'register'
]);
Route::post('/register', [
'uses' => 'Auth\AuthController@postRegister',
'as' => 'register.post'
]);
Per l'implementazione del CAPTCHA dobbiamo affidarci ad una libreria. Per gli esempi ho utilizzato captcha che oltre ad essere di buona fattura è disponibile come dipendenza composer. Installiamola con:
composer require mews/captcha
e pubblichiamone la configurazione con:
php artisan vendor:publish
verrà creato il file config/captcha.php
.
Dopo aver creato il file resources/view/register.blade.php
(che sarà disponibile nei sorgenti), configuriamo l'AuthController
in base alle nostre esigenze.
Per far questo dobbiamo modificare le regole di validazione in quanto è disponibile un nuovo campo, il CAPTCHA che richiede una validazione e il metodo di costruzione per impostare su false
il nuovo campo admin
(passaggio non strettamente obbligatorio in quanto i campi boolean sono falsi di default).
protected function validator(array $data)
{
return Validator::make($data, [
'name' => 'required|max:255',
'email' => 'required|email|max:255|unique:users',
'password' => 'required|confirmed|min:6',
'captcha' => 'required|captcha'
]);
}
protected function create(array $data)
{
return User::create([
'name' => $data['name'],
'email' => $data['email'],
'password' => bcrypt($data['password']),
'admin' => false
]);
}
Facciamo quindi un test di registrazione alla fine del quale dovremmo ritrovarci nella home ma con un nuovo utente archiviato su database.