TP sur les entrées-sorties

Page Home (contact) Retour TPs

Support de cours


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.


Vérification d'un mot de passe - lecture de tout le fichier des mots de passe en mémoire

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).

Correction :

Classe Utilisateur


Vérification d'un mot de passe - lecture partielle du fichier des mots de passe

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.

Correction :

Classe Utilisateur


Changer un mot de passe

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).

Correction :

Classe Utilisateur


Avec des mots de passe cryptés

Expliquez ce qui changerait si les mots de passe étaient cryptés avec SHA-256 et codés avec Base64.

Correction :

Explications


Page Web et expressions régulières

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.

  1. Ecrivez une classe PageWeb qui représente une page HTML identifiée par un URL. Cette classe contiendra
  2. Ajoutez à la classe 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>.
    Pour la page HTML locale (et pour la page Web distante donnée ci-dessus) il devra s'afficher
    Titre 1.1
    Titre 1.2
    Titre 2.1
    Titre 2.2
    Titre 2.3

Correction :

PageWeb.java
TestPageWeb.java


Pour ceux qui ont déjà fini :

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.


Retour TPs