Comment créer un formulaire de connexion avec CodeIgniter 4

Accueil PHP 8 Comment créer un formulaire de connexion avec CodeIgniter 4

Lorsque l’on développe une application web, il est essentiel de mettre en place un système d’authentification fiable depuis un formulaire de connexion pour protéger l’accès aux données sensibles. Que ce soit pour un back-office, une plateforme de gestion ou un espace client, restreindre l’accès aux utilisateurs autorisés est une priorité.

Dans ce tutoriel, nous allons voir comment créer un formulaire de connexion sécurisé avec CodeIgniter 4. Nous mettrons en place une authentification simple avec une redirection automatique vers une page de connexion si l’utilisateur n’est pas identifié.

Nous verrons également comment protéger toutes les pages de l’application pour qu’elles ne soient accessibles qu’aux utilisateurs connectés.

Si vous débutez avec CodeIgniter 4, pas d’inquiétude : nous expliquerons chaque étape en détail pour vous permettre de suivre facilement. 🚀

Préparer l’environnement

Avant de commencer, assure-toi d’avoir :

Si ce n’est pas encore fait, télécharge CodeIgniter 4 et configure ta base de données dans .env :

database.default.hostname = localhost
database.default.database = nom_de_ta_base
database.default.username = root
database.default.password = ton_mot_de_passe
database.default.DBDriver = MySQLi

Créer la table users

On a besoin d’une table pour stocker les utilisateurs :

CREATE TABLE users (
    id INT AUTO_INCREMENT PRIMARY KEY,
    username VARCHAR(50) NOT NULL UNIQUE,
    password VARCHAR(255) NOT NULL
);

Ajoute un utilisateur test avec un mot de passe haché :

$password = password_hash('mon_mot_de_passe', PASSWORD_DEFAULT);

Et insère-le dans la base :

INSERT INTO users (username, password) VALUES ('admin', '$2y$10$...');

Créer le modèle UserModel

Dans app/Models/UserModel.php :

<?php

namespace App\Models;

use CodeIgniter\Model;

class UserModel extends Model
{
    protected $table = 'users';
    protected $primaryKey = 'id';
    protected $allowedFields = ['username', 'password'];

    public function getUserByUsername($username)
    {
        return $this->where('username', $username)->first();
    }
}

Créer le contrôleur Auth

Dans app/Controllers/Auth.php (En savoir plus sur les Controller, route et vue) :

<?php

namespace App\Controllers;

use App\Models\UserModel;

class Auth extends BaseController
{
    public function login()
    {
        return view('auth/login');
    }

    public function loginPost()
    {
        $session = session();
        $userModel = new UserModel();

        $username = $this->request->getPost('username');
        $password = $this->request->getPost('password');

        $user = $userModel->getUserByUsername($username);

        if ($user && password_verify($password, $user['password'])) {
            $session->set('isLoggedIn', true);
            return redirect()->to('/dashboard');
        } else {
            $session->setFlashdata('error', 'Identifiants incorrects.');
            return redirect()->to('/login');
        }
    }

    public function logout()
    {
        session()->destroy();
        return redirect()->to('/login');
    }
}

Créer la vue du formulaire de connexion

Dans app/Views/auth/login.php :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Connexion</title>
</head>
<body>
    <h2>Connexion</h2>
    <?php if (session()->getFlashdata('error')) : ?>
        <p style="color:red;"><?= session()->getFlashdata('error') ?></p>
    <?php endif; ?>
    <form action="<?= base_url('/login') ?>" method="post">
        <label>Nom d'utilisateur :</label>
        <input type="text" name="username" required>
        <label>Mot de passe :</label>
        <input type="password" name="password" required>
        <button type="submit">Se connecter</button>
    </form>
</body>
</html>

Protéger les pages (Middleware)

Crée un filtre pour empêcher l’accès aux pages sans être connecté.

Dans app/Filters/AuthFilter.php :

<?php

namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class AuthFilter implements FilterInterface
{
    public function before(RequestInterface $request, $arguments = null)
    {
        if (!session()->get('isLoggedIn')) {
            return redirect()->to('/login');
        }
    }

    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // Ne rien faire après l'exécution
    }
}

Et active-le dans app/Config/Filters.php :

phpCopierModifierpublic $filters = [
    'auth' => ['before' => ['dashboard/*']]
];

Créer la page d’accueil du backoffice

Dans app/Controllers/Dashboard.php :

<?php

namespace App\Controllers;

class Dashboard extends BaseController
{
    public function index()
    {
        return view('dashboard/index');
    }
}

Et la vue app/Views/dashboard/index.php :

<!DOCTYPE html>
<html lang="fr">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Tableau de bord</title>
</head>
<body>
    <h2>Bienvenue dans le backoffice</h2>
    <a href="<?= base_url('/logout') ?>">Déconnexion</a>
</body>
</html>

Définir les routes

Ajoute ces routes dans app/Config/Routes.php :

$routes->get('/login', 'Auth::login');
$routes->post('/login', 'Auth::loginPost');
$routes->get('/logout', 'Auth::logout');
$routes->get('/dashboard', 'Dashboard::index', ['filter' => 'auth']);

Comment ça marche ?

  1. Quand l’utilisateur visite /login, il voit le formulaire de connexion.
  2. Quand il soumet le formulaire, le contrôleur Auth::loginPost :
    • Vérifie si l’utilisateur existe dans la base.
    • Vérifie si le mot de passe est correct.
    • Stocke une session isLoggedIn = true si c’est bon.
    • Redirige vers /dashboard.
  3. Le filtre AuthFilter empêche l’accès aux pages sans être connecté.
  4. L’utilisateur peut se déconnecter via /logout.

Ce système protège toutes les pages du backoffice et ne permet l’accès qu’aux utilisateurs connectés. Il est aussi sécurisé grâce au hachage des mots de passe.

Formation web et informatique - Alban Guillier - Formateur

Des formations informatique pour tous !

Débutant ou curieux ? Apprenez le développement web, le référencement, le webmarketing, la bureautique, à maîtriser vos appareils Apple et bien plus encore…

Formateur indépendant, professionnel du web depuis 2006, je vous accompagne pas à pas et en cours particulier, que vous soyez débutant ou que vous souhaitiez progresser. En visio, à votre rythme, et toujours avec pédagogie.

Découvrez mes formations Qui suis-je ?

Modification pour forcer la connexion dès l’accueil

On va s’assurer que :

  1. La page d’accueil (/) affiche le formulaire de connexion.
  2. Toutes les pages sont protégées et nécessitent une connexion.
  3. Les utilisateurs non connectés sont toujours redirigés vers /login.

Modifier la route d’accueil

Dans app/Config/Routes.php, fais pointer l’accueil (/) vers Auth::login :

$routes->get('/', 'Auth::login');
$routes->get('/login', 'Auth::login');
$routes->post('/login', 'Auth::loginPost');
$routes->get('/logout', 'Auth::logout');
$routes->get('/dashboard', 'Dashboard::index', ['filter' => 'auth']);

Maintenant, si quelqu’un accède à /, il verra directement le formulaire de connexion.

Améliorer le filtre de sécurité

On va modifier le filtre AuthFilter pour bloquer toutes les pages sauf /login et /logout.

Dans app/Filters/AuthFilter.php, change le before() :

<?php

namespace App\Filters;

use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Filters\FilterInterface;

class AuthFilter implements FilterInterface
{
        public function before(RequestInterface $request, $arguments = null)
    {
        $session = session();
        $uri = service('uri')->getPath(); // Récupère l'URL demandée

        if (!$session->get('isLoggedIn') && !in_array($uri, ['login', 'logout'])) {
            return redirect()->to('/login');
        }
    }
    public function after(RequestInterface $request, ResponseInterface $response, $arguments = null)
    {
        // Ne rien faire après l'exécution
    }
}

Avec ça :

  • Si l’utilisateur est connecté, il accède aux pages librement.
  • Si l’utilisateur n’est pas connecté, il est automatiquement redirigé vers /login sauf pour /logout.

Appliquer le filtre sur toutes les pages

Dans app/Config/Filters.php, applique le filtre auth sur toutes les requêtes :

public array $aliases = [
        'csrf'  => \CodeIgniter\Filters\CSRF::class,
        'toolbar' => \CodeIgniter\Filters\DebugToolbar::class,
        'auth'  => \App\Filters\AuthFilter::class, // Ajoute cette ligne
    ];

public array $globals = [
    'before' => [
        'auth' => ['except' => ['login', 'logout']]
    ],
    'after' => []
];

Cela signifie que toutes les pages sont protégées sauf /login et /logout.

Tester les protections

ActionRésultat attendu
Aller sur /Affiche la page de connexion
Essayer /dashboard sans être connectéRedirige vers /login
Se connecterRedirige vers /dashboard
Aller sur /dashboard après connexionAccès autorisé
Se déconnecterRedirige vers /login

Conclusion

Désormais :

✅ La page /login est la seule accessible sans connexion.
✅ Toutes les autres pages sont protégées.
✅ Si un utilisateur non connecté tente d’accéder à une autre page, il est redirigé vers /login.

Tester

✅ Accède à / → Il doit afficher la page de connexion.
✅ Essaie d’accéder à /dashboard sans être connecté → Redirigé vers /login.
✅ Connecte-toi → Accès autorisé.
✅ Déconnecte-toi → Retour à /login.

Vérifier la configuration de base

Ouvre app/Config/App.php et assure-toi que ces valeurs sont bien définies :

public $baseURL = 'http://localhost:8888/metalcustomer/';
public $indexPage = ''; // Assurez-vous que c'est vide pour enlever index.php des URLs

Puis vérifie que mod_rewrite est activé sur ton serveur Apache.

formulaire de connexion CodeIgniter 4

Mettre en place un système sécurisé avec un formulaire de connexion pour CodeIgniter 4 est une étape essentielle pour protéger l’accès à une application web. Grâce à l’utilisation d’un filtre d’authentification, nous avons pu restreindre l’accès aux pages sensibles et garantir que seuls les utilisateurs connectés puissent les consulter.

En suivant cette méthode, vous disposez désormais d’une base solide pour gérer les sessions et sécuriser votre back-office. Vous pouvez aller encore plus loin en ajoutant des fonctionnalités comme la gestion des rôles et permissions, la récupération de mot de passe ou encore l’authentification à deux facteurs.

L’authentification est un élément clé de toute application, et bien maîtriser ces concepts vous permettra de créer des systèmes plus robustes et professionnels.

Live on Twitch
  • 🔥 Vendredi 25 Avril 2025 >19h00

    HTML & SémantiqueStructure d'une page HTML