Wat zouden we willen

In het start template staat op de 'home' pagina een inlogformulier. Deze werkt nog niet, maar deze willen we graag laten werken. Schematisch zal het inloggen er zo uitzien.

login flow

Bij stap inlog formulier moeten we de 'action' van het formulier laten wijzen naar een 'route' die we moeten aanmaken in onze router.

case "/login":
    require "controllers/login.php";
    break;

We moeten de login controller aanmaken

- controle op invullen van email en wachtwoord
- selecteer de gebruiker met het betreffende email adres
- controleer of het wachtwoord van deze gebruiker overeenkomt met het ingevoerde wachtwoord

Indien één van deze stappen vaalt dan wordt de gebruiker teruggestuurd naar het inlog formulier.
Als alle stappen goed zijn doorlopen dan wil je dat er onthouden wordt dat de gebruiker is ingelogd. Zodat hij niet bij het surfen door je website bij elke pagina opnieuw moet inloggen.

Session

Dat onthouden dat een gebruiker is inlogd doen we in een session. Om hiervan gebruik te maken hebben we aan index.php helemaal boven in session_start(); toegevoegd.

Sessie variabele komen in $_SESSION te staan. Dit is een array die wij zelf kunnen vullen. En bewaard blijven zolang de browser open staat en de tijdsduur van de sessie niet is verstreken.

Omdat we de gegevens van de gebruiker op veel pagina's gaan gebruiken is het handig om alle gegevens van een gebruiker op te halen uit de database en in de sessie te zetten. (alleen wachtwoord liever niet)

Succesvol

Als alles goed is verlopen verwijzen we de gebruiker door middel van een redirect(...) door naar de pagina waar we de gebruiker na het inloggen heen willen sturen.

Voorbeeld van login controller

<?php

//controlle op aanwezigheid van email en wachtwoord
if (!(isset($_POST['email']) and isset($_POST['password']))) {
    require "view/login.view.php";
    die();
} else {
    if (empty($_POST['email'])) {
        $error = "Email mag niet leeg zijn";
        require "view/login.view.php";
        die();
    }
    if (empty($_POST['password'])) {
        $error = "Wachtwoord mag niet leeg zijn";
        require "view/login.view.php";
        die();
    }
}
//selecteren van de gebruiker in de database adh van email
$db = new Database();
$user = $db->query("SELECT * FROM users WHERE email=?", [$_POST['email']])->fetch();

// bestaat deze gebruiker?
if (!$user) {
    $error = "Gebruiker bestaat niet";
    require "view/login.view.php";
    die();
}
//controleren of wachtwoord juist is
if (!password_verify($_POST['password'], $user['password'])) {
    $error = "Onjuist wachtwoord";
    require "view/login.view.php";
    die();
}
//gebruiker in session zetten, maar het wachtwoord laten we weg
unset($user['password']);
$_SESSION['user'] = $user;

//doorverwijzen waar we de ingelogde gebruiker naar toe willen laten gaan
redirect("/home");

Rollen

In de applicatie die we bouwen kan een gebruiker meerdere rollen hebben. Een gebruiker kan een administator zijn of een gewone gebruiker. Deze rol moeten we aan een gebruiker toekennen. Daarvoor moeten we aan onze users tabel een veld 'role' toevoegen.

Dit toevoegen kan met het volgende SQL-commando

ALTER TABLE `users`
   ADD COLUMN `role` ENUM('admin','user') NULL DEFAULT 'user' AFTER `password`;

Dit kan ook handmatig bv via Heidi-SQL