Login controller

Hier bespreken we kort het bestand /app/controllers/login.php

Voorbeeld van login controller (controllers/login.php)

<?php
$request->validate([
    'email' => ['required', 'email'],
    'password' => ['required']
]);

$db = new Database();

//gebruiker ophalen uit de database
$user = $db->query("SELECT * FROM users WHERE email = ? LIMIT 1", [
    $request->email
])->fetch();

//als er een gebruiker is gevonden
if ($user) {
    //wachtwoord controleren
    if (password_verify($_POST['password'], $user['password'])) {

        //gebruiker in session zetten, maar het wachtwoord laten we weg
        unset($user['password']);
        $_SESSION['user'] = $user;

        flash("Welkom terug " . $user['name'], true);
        //doorsturen naar de home pagina (of pas aan
        redirect("/");
    } else {
        $_SESSION['errors']['login'] = "Inloggegevens zijn niet correct";
    }
} else {
    $_SESSION['errors']['login'] = "Inloggegevens zijn niet correct";
}

// inloggen is niet gelukt, terug naar login pagina
view("login");

Hieronder in het kort wat er in de stappen wordt gedaan

$request->validate([
    'email' => ['required', 'email'],
    'password' => ['required']
]);

Verklaring: Validatie op het invullen van email adres en wachtwoord

$user = $db->query("SELECT * FROM users WHERE email = ? LIMIT 1", [
    $request->email
])->fetch();

Zoeken naar een user met het betreffende emailadres

if ($user) {
    ...
} else {
    $_SESSION['errors']['login'] = "Inloggegevens zijn niet correct";
}

Verklaring: Indien de $user gevonden is dan gaan we verder. Anders zetten we errors in de $_SESSION zodat deze op het inlogformulier getoond worden.

if (password_verify($_POST['password'], $user['password'])) {

Hier wordt de hash van het wachtwoord dat in de database staat vergeleken met het meegestuurde wachtwoord.
In de database staat het wachtwoord als hash omdat dan het originele wachtwoord niet of zeer moeilijk is te achterhalen uit een hash. Dus mocht een hacker de database in komen, dan heeft hij nog niet de wachtwoorden van de gebruikers. De functie password_verify(...) zal true teruggeven wanneer het wachtwoord overeen komt met de HASH uit de database.

unset($user['password']);
$_SESSION['user'] = $user;

Daarna wissen we het wachtwoord uit de user gegevens
En we zetten de overige gegevens van de $user in een SESSION