Commit 6a66c100 authored by Johann Bournazel's avatar Johann Bournazel
Browse files

Ajout de l'inscription et ajout du chiffrement SHA512

parent 47bac812
......@@ -52,14 +52,27 @@ class Routeur {
$this->ControleurJeu->jeu($_GET["actX"], $_GET["actY"], $_GET["actMauvX"], $_GET["actMauvY"]);
}
} else {
if(isset($_POST['pseudo']) && isset($_POST['motDePasse'])){
if($this->ControleurAuthentification->verifieIdentifiants($_POST['pseudo'],$_POST['motDePasse'])){
if(isset($_POST['pseudoConnexion']) && isset($_POST['motDePasseConnexion'])){
if($this->ControleurAuthentification->verifieIdentifiantsConnexion($_POST['pseudoConnexion'],$_POST['motDePasseConnexion'])){
header('Location: index.php');
}else{
$this->ControleurAuthentification->mauvaisIdentifiants();
$this->ControleurAuthentification->mauvaisIdentifiantsConnexion();
}
}else{
$this->ControleurAuthentification->demandeAuthentification();
if(isset($_POST['pseudoInscription']) && isset($_POST['motDePasseInscription'])){
if($this->ControleurAuthentification->verifieIdentifiantsInscription($_POST['pseudoInscription'],$_POST['motDePasseInscription'])==true){
header('Location: index.php');
}else{
$this->ControleurAuthentification->mauvaisIdentifiantsInscription();
}
}else{
if(!isset($_GET['inscription'])){
$this->ControleurAuthentification->demandeAuthentification();
}else{
$this->ControleurAuthentification->demandeInscription();
}
}
}
}
}
......
......@@ -2,39 +2,77 @@
require_once PATH_VUES . "/VueAuthentification.php";
require_once PATH_MODELES . "/ModeleAuthentification.php";
class ControleurAuthentification
{
//Classe Controleur qui permet de gérer l'authentification ou l'inscription d'un utilisateur.
class ControleurAuthentification{
//On définit les variable qui vont correspondre à la vue et au modèle.
private $vue;
private $modele;
function __construct()
{
//Constructeur de la classe.
function __construct(){
//On instancie notre vue et notre modèle.
$this->vue = new VueAuthentification();
$this->modele = new ModeleAuthentification();
}
function demandeAuthentification()
{
$this->vue->afficheDemandeAuthentification();
}
//Méthode permettant de demander l'authentification à un utilisateur.
function demandeAuthentification(){
//On affiche visuellement une demande d'authentification.
$this->vue->afficheDemandeAuthentification();
}
function mauvaisIdentifiants()
{
$this->vue->afficheMauvaisIdentifiants();
}
//Méthode permettant de demander l'inscription à un utilisateur.
function demandeInscription(){
//On affiche visuellement une demande d'inscription.
$this->vue->afficheDemandeInscription();
}
//Méthode permettant d'indiquer à l'utilisateur qu'il a saisit de mauvais identifiants de connexion.
function mauvaisIdentifiantsConnexion(){
//On affiche visuellement le fait que les identifiants sont incorrects.
$this->vue->afficheMauvaisIdentifiantsConnexion();
}
function verifieIdentifiants($pseudo, $motDePasse)
{
//Si les identifiants sont valides
if ($this->modele->verifieIdentifiants($pseudo, $motDePasse) == true) {
//Méthode permettant d'indiquer à l'utilisateur qu'il a saisit de mauvais identifiants d'inscription.
function mauvaisIdentifiantsInscription(){
//On affiche visuellement le fait que les identifiants sont incorrects.
$this->vue->afficheMauvaisIdentifiantsInscription();
}
//Méthode permettant de vérifier des identifiants de connexion.
function verifieIdentifiantsConnexion($pseudo, $motDePasse){
//Si les identifiants fournit sont valides
if ($this->modele->verifieIdentifiantsConnexion($pseudo, $motDePasse) == true) {
//On garde en session le fait que l'utilisateur soit authentifié.
$_SESSION['Auth'] = true;
//On garde en session son pseudo.
$_SESSION['pseudo'] = $pseudo;
//On recharge la page.
header('Location: index.php');
//La vérification a réussie.
return true;
} else {
return false;
//La vérification a échouée.
return false;
}
}
//Méthode permettant de vérifier des identifiants de connexion.
function verifieIdentifiantsInscription($pseudo, $motDePasse){
//Si l'utilisateur a bien été inscrit
if ($this->modele->verifieIdentifiantsInscription($pseudo, $motDePasse) == true) {
//On le connecte et on stocke en session ces infos.
$_SESSION['Auth'] = true;
$_SESSION['pseudo'] = $pseudo;
//On recharge la page.
header('Location: index.php');
//L'inscription a réussie.
return true;
} else {
//L'inscription a échouée.
return false;
}
}
}
?>
......@@ -11,26 +11,11 @@
if(CRYPT_SHA512 == 1){
$mdp = "johann";
$mdp_crypté = crypt($mdp, '$6$rounds=5000$passeleseldetablestp$');
echo $mdp_crypté;
}
echo '</br>';
echo '</br>';
$sep = explode('$',$mdp_crypté);
$methode = $sep[1];
$rounds = $sep[2];
$salt = $sep[3];
$crypt = $sep[4];
$mdp_a_tester = crypt("johan", $mdp_crypté);
$mdp_a_tester2 = crypt("johann", $mdp_crypté);
echo "crypt1: ".$mdp_a_tester;
echo '</br>';
echo '</br>';
echo "crypt2: ".$mdp_a_tester2;
$mdp_a_tester = crypt("johann", '$6$rounds=5000$passeleseldetablestp$');
echo $mdp_crypté;
if(hash_equals($mdp_crypté, $mdp_a_tester)){
echo "Le mdp1 est valide";
}else{
......@@ -38,12 +23,8 @@ if(hash_equals($mdp_crypté, $mdp_a_tester)){
}
echo '</br>';
echo '</br>';
if(hash_equals($mdp_crypté, $mdp_a_tester2)){
echo "Le mdp2 est valide";
}else{
echo "Le mdp2 est invalide";
//echo "titi:";
//echo "<br/>";
//echo crypt("titi", '$6$VsDCW/kqInRv$/bkDT4rmkNLGo704srZE1riI4u7IUUcSuuEqrdkeBJ.3RcsnEO.ihAnWvIWJ0fSoP3hVa/OpWTbhi50xQhzEk1');
}
?>
......@@ -2,19 +2,16 @@
// Classe generale de definition d'exception
class MonException extends Exception {
private $chaine;
protected $message;
public function __construct($chaine) {
$this->chaine = $chaine;
public function __construct($message) {
$this->message = $message;
}
public function afficher() {
return $this->chaine;
return $this->message;
}
}
// Exception relative à un probleme de connexion
class ConnexionException extends MonException {
}
......@@ -23,112 +20,97 @@ class ConnexionException extends MonException {
class TableAccesException extends MonException {
}
// Classe qui gère les accès à la base de données
// Classe Modele qui permet de gérer les données liés à l'authentification et l'in,scription d'un utilisateur.
class ModeleAuthentification {
//On déclare une variable allant définir notre connexion à la base de données.
private $connexion;
// Constructeur de la classe
// Constructeur de la classe
public function __construct() {
try {
//On définit les attributs permettant la connexion à notre base de données.
$chaine = "mysql:host=" . HOST . ";dbname=" . BD;
//On déclare un nouvel objet qui représente une connexion entre PHP et un serveur de base de données.
$this->connexion = new PDO($chaine, LOGIN, PASSWORD);
//On configure un attribut du gestionnaire de base de données. Ici on souhaite que lorsque l'on rencontre une erreur, ça soit une exception qui soit levée.
$this->connexion->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
} catch (PDOException $e) {
$exception = new ConnexionException("problème de connexion à la base");
throw $exception;
throw new ConnexionException("Problème de connexion à la base de donnée. Veuillez vérifier votre configuration.");
}
}
// A développer
// méthode qui permet de se deconnecter de la base
//Méthode qui permet de se deconnecter de la base de données.
public function deconnexion() {
//On donne la valeur null à l'attibut connexion afin de se déconnecter.
$this->connexion = null;
}
//A développer
// utiliser une requête préparée
//vérifie qu'un pseudo existe dans la table pseudonyme
// post-condition retourne vrai si le pseudo existe sinon faux
// si un problème est rencontré, une exception de type TableAccesException est levée
public function verifieIdentifiants($pseudo, $motDePasse) {
try {
$statement = $this->connexion->prepare("select * from joueurs where pseudo=? and motDePasse=?;");
$statement->bindParam(1, $pseudo);
$statement->bindParam(2, $motDePasse);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
if (count($result) == 2) {
return true;
} else {
return false;
}
} catch (PDOException $e) {
$this->deconnexion();
//throw new TableAccesException("problème avec la table pseudonyme");
}
}
//A développer
// utiliser uen requête préparée
// ajoute un message sur le salon => pseudonyme + message
// precondition: le pseudo existe dans la table pseudonyme
// post-condition: le message est ajouté dans la table salon
// si un problème est rencontré, une exception de type TableAccesException est levée
public function majSalon($pseudo, $message) {
try {
$statement = $this->connexion->prepare("select id from pseudonyme where pseudo=?;");
$statement->bindParam(1, $pseudoParam);
$pseudoParam = $pseudo;
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
$statement = $this->connexion->prepare("INSERT INTO salon (idpseudo, message) VALUES (?,?);");
$statement->bindParam(1, $result['id']);
$statement->bindParam(2, $message);
$statement->execute();
} catch (PDOException $e) {
$this->deconnexion();
throw new TableAccesException("problème avec la table salon");
}
}
//A développer
//utiliser une requête classique
// méthode qui permet de récupérer les 10 derniers messages émis sur le salon
// post-condition:
//retourne un tableau qui contient des objets de type Message (script de la classe Message dans le répertoire métier)
// c'est en fait simplement le résultat de l'application de la méthode fetchAll() avec le bon paramètre
// si un problème est rencontré, une exception de type TableAccesException est levée
public function get10RecentMessage() {
try {
$statement = $this->connexion->query("SELECT pseudonyme.pseudo ,salon.message FROM salon, pseudonyme where salon.idpseudo=pseudonyme.id ORDER BY salon.id DESC LIMIT 0, 10;");
return ($statement->fetchAll(PDO::FETCH_CLASS, "Message"));
} catch (PDOException $e) {
$this->deconnexion();
throw new TableAccesException("problème avec la table salon");
}
}
//Méthode qui permet de vérifier si des identifiants fournit par un utilisateur correspondent à ceux présents dans la base de données.
public function verifieIdentifiantsConnexion($pseudo, $motDePasse) {
try {
//On regarde d'abord si ce pseudo existe.
$statement = $this->connexion->prepare("select * from joueurs where pseudo=?;");
$statement->bindParam(1, $pseudo);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
//Si le pseudo fournit existe
if (count($result) == 2) {
//On utilise comme métode de chiffrement SHA512.
if(CRYPT_SHA512 == 1){
//On chiffre le mot de passe que l'utilisateur a fournit et on utilise comme sel, le mot de passe correspondant au pseudo qui vient d'être vérifié.
$motDePasse_crypte = crypt($motDePasse, $result['motDePasse']);
}
//Si le mot de passe(une fois chiffré) fournit par l'utilisateur, correspond à celui présent dans la base de données
if($motDePasse_crypte == $result['motDePasse']){
//Les identifiants sont corrects et la connexion est réussie
return true;
}else{
//Le pseudo fournit est correct mais le mot de passe n'est pas correct.
return false;
}
} else {
//Le pseudo fournit par l'utilisateur n'existe pas.
return false;
}
} catch (PDOException $e) {
$this->deconnexion();
throw new TableAccesException("Problème avec la table joueurs.");
}
}
//Méthode qui permet de vérifier si des identifiants fournit par un utilisateur permettent une inscription.
public function verifieIdentifiantsInscription($pseudo, $motDePasse) {
try {
//On regarde d'abord si le pseudo est libre
$statement = $this->connexion->prepare("select * from joueurs where pseudo=?;");
$statement->bindParam(1, $pseudo);
$statement->execute();
$result = $statement->fetch(PDO::FETCH_ASSOC);
//Si il est libre
if (!count($result) != 2) {
//On définit la méthode de chiffrement sur SHA512
if(CRYPT_SHA512 == 1){
//On chiffre le mot de passe grâce à notre sel.
$motDePasse_crypte = crypt($motDePasse, '$6$rounds=5000$PasseLeSelDeTableStp$');
}
//On ajoute les identifiants du nouvel utilisateur à la base de données.
$statement = $this->connexion->prepare("insert into joueurs values(?,?);");
$statement->bindParam(1, $pseudo);
$statement->bindParam(2, $motDePasse_crypte);
$statement->execute();
//L'inscription a réussie.
return true;
} else {
//Le pseudo choisi existe déjà. L'inscripion est donc impossible.
return false;
}
} catch (PDOException $e) {
$this->deconnexion();
//throw new TableAccesException("problème avec la table pseudonyme");
}
}
}
......
<?php
//Classe Vue permettant d'afficher les pages.
class VueAuthentification{
//Affiche une page d'authentification.
function afficheDemandeAuthentification(){
readfile(PATH_VUES."/htmlAuthentification.html");
//On affichhe le fichiers HTML lié à cette page.
readfile(PATH_VUES."/html/htmlAuthentification.html");
}
//Affiche une page indiquant la saisie de mauvais identifiants de connexion.
function afficheMauvaisIdentifiantsConnexion(){
//On affichhe le fichiers HTML lié à cette page.
readfile(PATH_VUES."/html/htmlAuthentificationEchoue.html");
}
function afficheMauvaisIdentifiants(){
readfile(PATH_VUES."/htmlAuthentificationEchoue.html");
//Affiche une page d'inscription.
function afficheDemandeInscription(){
//On affichhe le fichiers HTML lié à cette page.
readfile(PATH_VUES."/html/htmlInscription.html");
}
//Affiche une page indiquant la saisie de mauvais identifiants d'inscription.
function afficheMauvaisIdentifiantsInscription(){
//On affichhe le fichiers HTML lié à cette page.
readfile(PATH_VUES."/html/htmlInscriptionEchoue.html");
}
}
?>
\ No newline at end of file
......@@ -17,7 +17,7 @@ html, body, *{
}
html{
background-color:whitesmoke;
background-color:#b0b0b033;
}
.flex-container{
display: flex;
......@@ -43,8 +43,14 @@ html{
}
.mg-bottom-35{
margin-bottom:35px;
}
.mg-top-35{
margin-top:35px;
}
.mg-top-10{
margin-top:10px;
}
.header-small{
height:40px;
}
......@@ -88,7 +94,7 @@ html{
}
.form-group{
display:block;
}
input[type='text']{
......@@ -114,7 +120,6 @@ label{
input[type='submit']{
margin-top: 20px;
margin-bottom: 35px;
cursor: pointer;
height: 40px;
width: 150px;
......@@ -146,4 +151,9 @@ input[type='submit']:hover{
font-size: 11px;
font-family: Roboto;
word-wrap: break-word;
}
.small-link{
font-family: Roboto;
font-size: 13px;
color:grey;
}
\ No newline at end of file
......@@ -9,34 +9,39 @@
<body>
<div class="flex-container">
<div class="card mg-bottom-35">
<div class="card mg-top-35">
<div class="card-header bg-blue color-white ft-caviar">
<h2 class="card-title">JEU DU BRIDGES</h2>
</div>
<form method="post" action="index.php">
<form method="post" action="../src/index.php">
<h3 class="title">Connexion</h3>
<h3 class="sub-title">Entrez votre pseudo et votre mot de passe pour accéder au jeu.</h3>
<div class="form-group">
<label for="pseudo">Pseudo</label>
<label for="pseudoConnexion">Pseudo</label>
<br/>
<input type="text" name="pseudo" id="pseudo" placeholder="Entrez votre pseudo"/>
<input type="text" name="pseudoConnexion" id="pseudoConnexion" placeholder="Entrez votre pseudo"/>
</div>
<div class="form-group">
<label for="motDePasse">Mot de passe</label>
<label for="motDePasseConnexion">Mot de passe</label>
<br/>
<input type="text" name="motDePasse" id="motDePasse" placeholder="Entrez votre mot de passe"/>
<input type="text" name="motDePasseConnexion" id="motDePasseConnexion" placeholder="Entrez votre mot de passe"/>
</div>
<div class="form-group">
<input type="submit" name="soumettre" value="Se connecter"/>
</div>
<div class="form-group mg-top-10 mg-bottom-35">
<a href="?inscription=true" class="small-link">Pas encore inscrit ?</a>
</div>
</form>
</div>
</div>
......
......@@ -9,14 +9,14 @@
<body>
<div class="flex-container">
<div class="card mg-bottom-35">
<div class="card mg-top-35">
<div class="card-header bg-blue color-white ft-caviar">
<h2 class="card-title">JEU DU BRIDGES</h2>
</div>
<form method="post" action="index.php">
<form method="post" action="../src/index.php">
<h3 class="title">Connexion</h3>
<h3 class="sub-title">Entrez votre pseudo et votre mot de passe pour accéder au jeu.</h3>
......@@ -24,39 +24,28 @@
<h2 class="bad-credentials color-error">Vous avez entré des identifiants incorrects.</h2>
<div class="form-group">
<label for="pseudo">Pseudo</label>
<label for="pseudoConnexion">Pseudo</label>
<br/>
<input type="text" name="pseudo" id="pseudo" placeholder="Entrez votre pseudo"/>
<input type="text" name="pseudoConnexion" id="pseudoConnexion" placeholder="Entrez votre pseudo"/>
</div>
<div class="form-group">
<label for="motDePasse">Mot de passe</label>
<label for="motDePasseConnexion">Mot de passe</label>
<br/>
<input type="text" name="motDePasse" id="motDePasse" placeholder="Entrez votre mot de passe"/>
<input type="text" name="motDePasseConnexion" id="motDePasseConnexion" placeholder="Entrez votre mot de passe"/>
</div>
<div class="form-group">
<input type="submit" name="soumettre" value="Se connecter"/>
</div>
<div class="form-group mg-top-10 mg-bottom-35">
<a href="?inscription=true" class="small-link">Pas encore inscrit ?</a>
</div>
</form>
</div>
</div>
<br/>
<div class="flex-container">
<div class="card">
<div class="card-header bg-error color-white ft-caviar header-small">
<h2 class="card-title">Indication</h2>
</div>
<div class="indication">
Les hashs ne sont pas encore pris en charge.
<br/>
Le mot de passe de <b>titi</b> est donc <b>$6$VsDCW/kqInRv$/bkDT4rmkNLGo704srZE1riI4u7IUUcSuuEqrdkeBJ.3RcsnEO.ihAnWvIWJ0fSoP3hVa/OpWTbhi50xQhzEk1</b>
</div>
</div>
</div>
</div>
......
<!DOCTYPE html>
<html lang="fr">
<head>
<meta charset="UTF-8">
<title>Jeu du Bridges - Inscription </title>
<link href="vues/css/authentification.css" rel="stylesheet" type="text/css">
</head>
<body>
<div class="flex-container">
<div class="card mg-top-35">
<div class="card-header bg-blue color-white ft-caviar">
<h2 class="card-title">JEU DU BRIDGES</h2>
</div>
<form method="post" action="../src/index.php">
<h3 class="title">Inscription</h3>
<h3 class="sub-title">Choisissez un pseudo et un mot de passe pour vous créer un compte.</h3>
<div class="form-group">
<label for="pseudoInscription">Pseudo</label>
<br/>
<input type="text" name="pseudoInscription" id="pseudoInscription" placeholder="Choisissez votre pseudo"/>
</div>
<div class="form-group">
<label for="motDePasseInscription">Mot de passe</label>
<br/>
<input type="text" name="motDePasseInscription" id="motDePasseInscription" placeholder="Choisissez votre mot de passe"/>
</div>