ProgWebAv TP1

1) Création de la base de données

Laravel offre par défaut une méthode d’authentification des utilisateurs en utilisant leur ORM Eloquent. Les utilisateurs sont stockés en base de données et sont rendu accessibles dans l’application via le Model User. Nous allons pour le moment utiliser ce système d’authentification avant de voir d’autres solutions. Comme les utilisateurs sont sauvegardés en base de données, il serait bien de créer une base pour notre application ainsi qu’un user ayant les droits sur cette base.

Remarques: spécifiez bien l’encodage utf8mb4_unicode_ci pour votre nouvelle base de données. Pour plus d’homogénéité entre votre code et la correction, nommez votre base et votre utilisateur prog_web_av. Une fois ceci fait, modifiez le fichier d'environnement .env pour y mettre les informations de connexion nécessaires.

2) Création de la table users

Pour la création des tables, nous allons utiliser le système de migration de Laravel. Par contre, pour des raisons pédagogiques, nous n'allons pas utiliser l'entiérté des composants pré-existants afin de bien comprendre le mécanisme sensible de l'autentification.

Pour commencer, créez une migration pour la création de la table des utilisateurs grâce à la commande suivante:
php artisan make:migration create_users_table --create=users
Dans ce fichier de migration, faites le necessaire pour que la future table contienne les colonnes suivantes: id pour l’identifiant technique (auto-incrémenté), email (qui fera office de username), password, ainsi que les timestamps nécessaires à Laravel. Utilisez pour ce faire la classe Schema Builder. Puis réalisez la migration grâce à la commande suivante:
php artisan migrate

Générez ensuite un utilisateur de test via le système de seeding de Laravel. Par simplification, commencez par modifier le Model User déjà existant de Laravel. Editez simplement le fichier app/User.php et supprimez y les références aux colonnes name et remember_token, puisque ces champs n'existent pas dans notre table. Puis créez votre classe de seeding pour la création d'un utilisateur. Vous pouvez laisser l'artisan le faire pour vous grâce à la commande suivate:


php artisan make:seeder UsersTableSeeder
Editez ce fichier afin d'y ajouter la supression de tous les utilisateurs existant suivit de l'ajout d'un utilisateur de test. Vous pouvez utilisez la facade DB pour la supression de tous les utilisateur, ainsi que le modèle Eloquent User pour l'ajout d'un utilisateur. Reflechissez bien à comment sauvegarder le mot de passe de l'utilisateur dans la base (Hash). Une fois votre "seeder" ok, éditez le fichier database/seeds/DatabaseSeeder.php pour y décommenter la ligne 14. Enfin effectuez le seeding de votre base:

php artisan db:seed

Testez si vous pouvez vous authentifier avec cet utilisateur en fabriquant une route /testAuth et en faisant un Auth::attempt(['email' => $email, 'password' => $password]). (Pas besoin de contrôleur pour ce test.). Supprimez cette route de test si tout est ok.

3) Event handler ?

Pour notre application, il serait pratique de savoir qui se connecte et à quel moment. Une manière parmis d'autre de le faire est d'utiliser le système de gestion des événements de Laravel et son système de log. Il est possible de créer et lancer (fire) ses propres événements mais comme nous avons utilisé la classe Auth de Laravel, Le framework génère déjà des events pour nous. Ajoutez comme indiqué dans la doc un listener permettant de détecter les login des utilisateurs dans la classe EventServiceProvider (la classe est dans app/Providers). Vous devez donc y modifier le tableau $listen pour qu'il ressemble à ceçi:


    protected $listen = [    
        'Illuminate\Auth\Events\Login' => [
            'App\Listeners\LogSuccessfulLogin',
        ],
    ];
Puis, pour créer le listener automatiquement, exécutez la commande suivante :

php artisan event:generate
Editez le fichier généré (App\Listeners\LogSuccessfulLogin) pour y modifier la méthode handle:

    public function handle(Login $event)
    {
        Log::info($event->user->email . ' logged');
    }
N'oubliez pas un "use Log" en haut du listeners. Testez à nouveau un login et vérifiez le fichier de log (disponible ici: storage/logs/laravel.log)

Finalement, essayez de créer un route accessible uniquement à un utilisateur donné (c.f: doc).

4) Auth controller

Maintenant que le système d’authentification est opérationnel, il faut implémenter le mécanisme de login des utilisateurs. Ceci sera bien sûr géré par un controller ainsi que des views. Implémentez un controller (et les routes associées) pour la réalisation des 3 actions suivantes:

5) View et tests

Réalisez la view pour la page de login en utilisant le moteur de template blade. Créez un groupe de routes qui requiert une authentification, puis deux routes de test à l’intérieur de ce groupe. Essayez d’accéder à ces pages en vérifiant que leur accès est bien limité aux utilisateurs connectés.