Page Home (contact) Retour TPs
Ce TP manipule un fichier de mots de passe conservés dans un fichier texte. Dans une application qui demande une identification des utilisateurs, une instance représentant l'utilisateur qui s'est identifié est conservée dans le contexte d'exécution. Cette instance pourra, par exemple, servir pour savoir si l'utilisateur a les droits pour lancer telle ou telle opération (par exemple consulter des comptes en banque ou modifier le nom d'un client). Vous allez écrire une classe Utilisateur
qui pourra servir à cet usage (après y avoir ajouté d'autres méthodes).
Dans un contexte réel les mots de passe ne doivent jamais être conservés en clair. Ils doivent être cryptés en utilisant un algorithme tel que MD5, ou mieux SHA256. Ceci afin d'éviter qu'une personne qui s'est introduite frauduleusement dans le système n'ait accès aux mots de passe de tous les utilisateurs. Le plus simple est de coder le résultat du cryptage avec Base64 ou Hex pour avoir le mot de passe crypté sous la forme d'une chaîne de caractères, ce qui permet de manipuler le mot de passe crypté comme une simple String. Il serait même préférable de saler le mot de passe.
Les noms des utilisateurs et leurs mots de passe sont enregistrés dans un fichier des mots de passe. Ce fichier des mots de passe sera considéré par l'application comme une ressource (voir cours sur les entrées-sorties ou, avec plus de détails, cours sur l'interface de java avec le système, section "ressources") et son emplacement sera désigné par un nom relatif au classpath ou au répertoire où est placée la classe Utilisateur.
Le format du fichier des mots de passe : chaque ligne du fichier contient un nom et un mot de passe, séparés par un ou plusieurs espaces. Certaines lignes n'ont qu'un seul nom ; en ce cas, elles contiennent un nom d'utilisateur qui n'a pas de mot de passe. Dans l'exemple suivant, le mot de passe de toto est bibi, guest n'a pas de mot de passe :
guest
toto bibi
bibi truc
riri machin
Pour cet exercice vous écrirez une version simple qui lit tout le fichier des mots de passe en mémoire.
Utilisez cette classe TestUtilisateur pour tester votre code, et ce squelette de classe pour la classe Utilisateur. Vous remarquerez qu'un mot de passe est rangé dans un char[]
et pas dans une String
, pour des raisons de sécurité (un lien pour les curieux).
Utilisez aussi cette classe AccesException qui est levée s'il y a un problème pour accéder au fichier des mots de passe (révision sur les exceptions et faciliterait aussi le changement de support pour les mots de passe, dans une base de données par exemple).
Pour cet exercice vous écrirez une version plus optimisé qui lit le fichier des mots de passe ligne par ligne et qui s'arrête de le lire dès que la ligne qui concerne l'utilisateur est lue. Utilisez pour cela la notion de flot, BufferedReader
en particulier pour lire le fichier des mots de passe ligne à ligne.
Dans la classe Utilisateur
, écrivez une méthode setMdp
qui change le mot de passe d'un utilisateur dans le fichier des mots de passe. Cette méthode prend en paramètre le nom de l'utilisateur, son ancien mot de passe et son nouveau mot de passe.
Pour cela vous lirez tout le fichier
des mots de passe dans une liste. Vous modifierez la liste et ensuite vous utiliserez la méthode Files.write
vue dans le cours pour écraserez l'ancien fichier des mots de passe. Cette
méthode
lancera une AccesException
si
une IOException
a été
levée (gardez bien la cause première de l'exception) ou si le
mot de passe de l'utilisateur courant (celui obtenu par getUtilisateur
) ne correspond pas à son mot de passe
dans le fichier des mots de passe (il a été modifié directement dans le fichier
des mots de passe).
Expliquez ce qui changerait si les mots de passe étaient cryptés avec SHA-256 et codés avec Base64.
Le but de cet exercice est de faire afficher tous les titres d'une page Web (les contenus des balises <h1>, <h2>,...).
Pour cela vous allez utiliser les expressions régulières.
PageWeb
qui représente une page HTML identifiée par un URL. Cette classe contiendraString lireContenu()
qui renvoie le code HTML de la page.main
pour tester la méthode lireContenu
en affichant le contenu d'une page HTML que vous mettrez à la racine du répertoire des sources de votre projet et dont l'URL sera récupéré par la méthode getResource
. Vous pouvez écrire votre propre page HTML ou utiliser celle-ci pour gagner du temps.main
testera aussi avec la page Web distante (ne la copiez pas dans votre projet ; l'URL commencera par "http://deptinfo.unice.fr"), ou une autre page Web distante quelconque.PageWeb
une méthode List<String> titres()
qui renvoie une liste de tous les titres de la page (contenus des balises <h1>, <h2>,...). Pour tester, écrivez une classe TestPageWeb
dont la méthode main
affiche ces titres dans une boucle for-each. L'expression régulière devra permettre de repérer les balises qui contiennent des espaces non significatifs telles que <h1 > ou les balises en majuscules telles que <H2>.Allez étudier la sérialisation dans le support de cours indiqué en haut de cette page, dans le tutoriel d'Oracle ou sur un des nombreux sites qui la décrive (par exemple http://www.jmdoudoux.fr/java/dej/chap020.htm). La sérialisation permet de sauvegarder un objet entier très simplement pour pouvoir le récupérer ensuite. Elle est très utile et elle est utilisée en particulier par Java pour les appels de méthode à distance (vers un objet qui se trouve sur un autre ordinateur) pour passer les valeurs des paramètres et la valeur de retour des méthodes.
Tutoriel Oracle sur les entrées-sorties.
Vous pouvez aussi refaire le TP en utilisant un fichier des mots de passe écrit en format "binaire" (pas texte). Vous pouvez aussi refaire le TP en cryptant les mots de passe avec SHA-256 avec un codage Base64 ; vous pouvez vous aider de cette classe utilitaire.