From 392a2ef5a89b60e2d161d6206681c9b220729a28 Mon Sep 17 00:00:00 2001 From: Vincent Chabredier Date: Thu, 30 Mar 2023 20:27:00 +0200 Subject: [PATCH] first draft --- tps/sem6/README.md | 145 +++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 132 insertions(+), 13 deletions(-) diff --git a/tps/sem6/README.md b/tps/sem6/README.md index 614fda0..1fa80dd 100644 --- a/tps/sem6/README.md +++ b/tps/sem6/README.md @@ -20,31 +20,150 @@ On va maintenant construire un leaderboard des combats qui ont été réalisés * Pour cela vous allez devoir coller le template suivant en tant que layout (`app/views/layouts/application.html.erb`) : ```erb - + + + + Les joyeux de la couronne WEB + + + <%= csrf_meta_tags %> + <%= csp_meta_tag %> + + + <%= stylesheet_link_tag "application", "data-turbo-track": "reload" %> + <%= javascript_importmap_tags %> + + + <%= yield %> + + + ``` Voici la vue de la page, prenez le temps de lire le code et comprendre quels attributs devra posséder le contrôleur : ```erb + + +
+ + + + + + + + + + + + + <% @combats.order(created_at: :desc).each do |combat| %> + + + + + + + + + <% end %> + +
DateNomCombatant 1Combatant 2RésultatGagnant
<%= l(combat.created_at, format: :short) %><%= combat.name %><%= combat.left_fighter.name %><%= combat.right_fighter.name %><%= combat.result.capitalize %><%= combat.winner&.name %>
+
``` +* Créez ou générez un contrôleur `Leaderboard` avec une action index et la route correspondante. + +* Copiez le template du layout comme indiqué ci-dessus + +* Copiez le code fourni ci-dessus dans la vue correspondant à l'action index (`app/views/leaderboard/index.html.erb`) + +* Modifiez le code de l'action index du contrôleur pour fournir à la vue ce dont elle a besoin pour afficher les combats. + +* Faites fonctionner la recherche présente dans la top bar pour filter les combats en fonction de leur nom (comme on l'a déjà fait dans l'API) + +* Améliorez cette recherche pour chercher également dans le nom des créatures combatantes. + +## Gestion des utilisateurs + +Nous allons ajouter à notre application des utilisateurs possédant un nom d'utilisateur et un mot de passe. + +Nous devons stocker ce mot de passe de manière sécurisée dans la base de donnée. + +Pour cela on va utiliser la méthode `has_secure_password` du module `ActiveModel::SecurePassword`. + +* Créez ou générez un modèle `User`possédant un `username` de type `string` + +* Faites en sorte qu'il ne puisse pas y avoir deux utilisateur créatures avec le même `username`. (Rappelez vous commment on a fait pour les créatures) + +* Lisez attentivement la documentation https://api.rubyonrails.org/v7.0.4/classes/ActiveModel/SecurePassword/ClassMethods.html, et adaptez votre code : + * Vous devez ajouter une gem spécifique à votre bundle (`bundle add xxx`) + * Vous devez ajouter un attribut à User (`bin/rails g migration addSecurePasswordToUsers xxx`) + * Vous pouvez maintenant appeler `has_secure_password` dans `user.rb` + +* Modifiez les seeds pour créer un utilisateur `root` ayant comme mot de passe `admin123` + +## Connexion + +On va permettre aux utilisateurs de s'authentifier dans notre application. + +Pour ça, on vous fourni la vue de l'écran de connexion : + +```erb +
+ <% if @error_message.present? %> + + <% end %> + + <%= form_with url: {action: :create}, class: "text-center" do |form| %> +

Merci de vous connecter

+ +
+ <%= form.text_field :username, class:"form-control", placeholder:"Identifiant", value: params[:username] %> + +
+
+ <%= form.text_field :password, class:"form-control", placeholder:"Mot de passe", value: params[:password] %> + +
+ <%= form.submit "Connexion", class: "w-100 btn btn-lg btn-primary mt-2", data: { turbo: "false" }%> + <% end %> +
+``` +* Créez ou générez un controlleur `UserSessions` avec deux actions : `new` et `create`, et les routes correspondantes. -leaderboard -fonction recherche avec joins +* L'action `new` affichera le formulaire, c'est pour cette action que vous utiliserez la vue fournie ci-dessus. -ajout d'un modèle user avec has_secure_password -1 seul utilisateur par name -password present +* Configurez la route pour brancher cet écran de connexion à l'url `http://localhost:3000/login` -creer un utilisateur admin dans les seeds -root -password: admin123 +* Coder l'action `create` qui : -ajouter un controleur de login -supporter les sessions + * Cherche l'utilisateur (`User`) correspondant à l'username reçu en param. + * Vérifie que le mot de passe est correcte. + * Si oui : + * Met l'utilisateur en sesion + * Redirige vers le leaderboard : `redirect_to controller: :leaderboard, action: :index` + * Si non, rend la vue `new` pour afficher de nouveau le formulaire : `render :new` + * La vue peut mème afficher un message d'erreur si vous définnissez le bon attribut dans l'action -brider la leaderboard aux utilisateurs connectés +### Protégez l'application -brider les controleurs d'API à basic auth +* Modifier le leaderboard pour brider son accès aux utilisateurs connectés +* Modifier les controleurs d'API pour brider leurs accès aux utilisateur présents en base de donnée, en forçant l'envoi de l'username et mot de passe en basic auth