Con questa lezione inizieremo il discorso riguardante la sezione amministrativa del nostro e-commerce implementando le funzionalità di login e logout.
Useremo la tabella predefinita users
di Laravel e il suo middleware Auth
per definire l'autenticazione su tutte le route principali della sezione amministrativa.
Controller e middleware
Cominciamo aggiungendo un utente predefinito nel database sfruttando l'utility Tinker digitando il comando
php artisan tinker
e inserendo nella shell interattiva le seguenti istruzioni:
$user = new App\Models\User();
$user->password = Hash::make('password');
$user->email = 'email@email.tld';
$user->name = 'Nome Cognome';
$user->save();
Creiamo quindi un nuovo controller per gestire la sezione amministrativa. Al suo interno definiamo prima le route che verranno protette dall'autenticazione di Laravel.
namespace App\Http\Controllers;
use App\Http\Controllers\Controller;
use App\Product;
use App\Customer;
use App\Order;
use App\Country;
use App\Province;
use App\Municipality;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Auth;
use Mpdf\Mpdf;
class DashboardController extends Controller
{
public function index()
{
return view('dashboard.index', [
'title' => 'Dashboard | PHP E-commerce'
]);
}
public function logout()
{
Auth::logout();
return redirect()->route('login');
}
public function products()
{
return view('dashboard.products', [
'title' => 'Products | PHP E-commerce'
]);
}
}
Per proteggere tutte queste route creiamo un gruppo di route per la sezione amministrativa con un prefisso specifico e protette dal middleware di autenticazione di Laravel.
// routes/web.php
// Qui le route del login
Route::group(['prefix'=>'dashboard', 'middleware' => 'auth'], function () {
Route::get('/', 'DashboardController@index')->name('dashboard-home');
Route::get('/logout', 'DashboardController@logout')->name('dashboard-logout');
Route::get('/products', 'DashboardController@products')->name('dashboard-products');
});
A questo punto se proviamo ad accedere al percorso /dashboard
e non siamo autenticati, Laravel ci reindirizzerà alla pagina di login. Possiamo osservare questo comportamento nella classe app/Http/Middleware/Authenticate.php
di Laravel.
La route per il login
Ora dobbiamo definire una route per il login e una per la sua elaborazione.
Route::get('/login', 'DashboardController@login')->name('login');
Route::post('/login', 'DashboardController@doLogin');
Quindi definiamo i due metodi nel nostro controller:
public function login()
{
return view('dashboard.login');
}
public function doLogin(Request $request)
{
$credentials = $request->only('email', 'password');
if (Auth::attempt($credentials)) {
$request->session()->regenerate();
return redirect()->route('dashboard-home');
}
return redirect()->route('login')->with('message', 'Invalid login.');
}
Gran parte della logica è già svolta da Laravel: Auth::attempt()
prova ad effettuare il login dell'utente usando le credenziali fornite. Se ha successo, rigeneriamo la sessione in modo da evitare il problema della session fixation e reindirizziamo l'utente sulla pagina principale dell'area amministrativa.
Al contrario, reindirizziamo l'utente sulla pagina di login con un messaggio di errore che possiamo mostrare nella view Blade come segue:
@if (session('message'))
<div class="alert alert-danger mb-5">
{{ session('message') }}
</div>
@endif
Il logout è svolto interamente dal metodo Auth::logout()
di Laravel che svuota la sessione utente permettendoci di effettuare un nuovo redirect sulla pagina di login.
Un potenziale problema da tenere presente è quello dei redirect infiniti quando si utilizza il middleware. Se notate le route del login sono state inserite al di fuori del gruppo di route protette dal middleware Auth
.
Se tali route fossero state poste all'interno si sarebbe generato un loop infinito di redirect in quanto la stessa pagina con il form di login avrebbe richiesto a sua volta di aver effettuato prima l'autenticazione.
A tal proposito è utile ricordare che Laravel inserisce il file public/favicon.ico
in ogni sua installazione. Si tratta di un file vuoto che serve unicamente allo scopo di prevenire un problema presente in alcuni browser come Google Chrome.
Questi ultimi infatti si aspettano che su ogni sito sia sempre presente un file favicon.ico
direttamente sotto la document root dello spazio Web. Quando si effettua un redirect tali browser possono innescare un errore HTTP 404 che porta al reset della sessione PHP quando viene effettuato un redirect. La conseguenza immediata è che gli utenti non possono più effettuare l'autenticazione sul sito.
Anche se il file della favicon viene inserito nelle pagine tramite l'elemento HTML link
, alcuni browser continueranno a cercarla prima all'indirizzo
https://sito.tld/favicon.ico
restituendo un errore HTTP 404 che nei casi sopracitati può di fatto compromettere l'intero funzionamento del sito.
Conclusione
In questo capitolo abbiamo visto come implementare la funzionalità di login/logout nella sezione amministrativa. Nel prossimo capitolo miglioreremo questa funzionalità aggiungendo il recupero della password.