1

Bon, voilà je voulais faire une classe pour gérer les logins, et j'ai trouvé un tutorial plutot complet (peut être trop:/).
L'adresse est: http://www.evolt.org/article/PHP_Login_System_with_Admin_Features/17/60384/
Vu que je débute en php, je voulais savoir ce que vous en pensiez, et si vous ne trouviez pas le code un peu trop lourd?

Merci

2

Il regroupe tout le code d'accès à la base de données dans une seule classe qui s'occupe d'effectuer les opérations d'ajout/retrait d'utilisateur, ce qui en soi n'a pas grand chose à voir avec une bdd. Pour moi la bdd n'est qu'un support de stockage.
Je n'approuve pas trop son découpage. La classe Process par exemple est un peu bizarre.
Et puis il semble utiliser des variables globales de façon peu sûre (cf : http://www.php.net/manual/fr/security.globals.php)
Je découperais autrement les classes :
classe Database : Abstraction de l'accès à une base de données. Permet d'exécuter une requête SQL et d'en récupérer le résultat.
classe Utilisateur : Représente un utilisateur, avec ses droits (admin, user, etc...)

Quand un utilisateur a besoin d'être identifié pour accéder à une page, tu lances un script qui vérifie que l'user est identifié, sinon tu rediriges vers un formulaire de login (formulaire qui remplira une variable de session si l'utilisateur est bien identifié).
Pour les pages seulement accessibles aux admins, tu fais pareil, sauf que tu vérifies non seulement que l'user est loggé mais qu'il est également admin.
Ça donnerait par exemple :
---- Fichier check_login.php ----
start_session();
if(!isset($_SESSION['user']))
{
  header("location: login.php?referer=".$_SERVER['PHP_SELF']);
  exit();
}


---- Fichier check_admin.php ----
require_once("check_login.php");
if(!$_SESSION['user']->is_admin())
{
  header("location: forbidden.php");
  exit();
}


---- Fichier sys_login.php ----
require_once("User.php"); // fichier contenant la définition de la classe User et de la fonction get_user($login,$pass);
$user = get_user($_POST['login'],$_POST[pwd]);
if($user != null)
{
  session_start();
  $_SESSION['user'] = $user;
}

header("location: ".$_POST['referer']);


---- Fichier login.php ----
<?php
if(!isset($_GET['referer']))
{
  $_GET['referer'] = "index.php";
}
?>
<html>
 <head></head>
 <body>
  <form action="sys_login.php" method="post">
    <input type="hidden" name="referer" value="<?=$_GET['referer']?>" />
    <label for="id_login">Identifiant : </label><input type="text" name="login" id="id_login" />
    <label for="id_pwd">Mot de passe : </label><input type="password" name="pwd" id="id_pwd" />
    <input type="submit" name="login" value="Connexion" />
  </form>
 </body>
</html>


---- Fichier User.php ----
define("LEVEL_USER",0);
define("LEVEL_ADMIN",1);

class User
{
  var $level;
  var $login;

  function User($id)
  {
    $resultset = $GLOBALS['database']->query("SELECT level,login FROM User WHERE num = ".$id);
    $user = $resultset->fetch_assoc();
    if($user == false)
    {
      trigger_error("Utilisateur incorrect");
    }
    $this->level = $user['level'];
    $this->login = $user['login']
  }

  function is_admin()
  {
    return $this->level == LEVEL_ADMIN;
  }
}

function get_user($login,$pwd)
{
  $resultset = $GLOBALS['database']->query("SELECT num FROM User WHERE login = '$login' AND pwd = '".md5($pwd)."'");
  $user = $resultset->fetch_assoc();
  if($user == false)
  {
    return null;
  }
  else
  {
    return new User($user['num']);
  }
}


Je ne donne pas le code de la classe Database. Mais en gros, la fonction query renvoie un objet de type ResultSet. Et ce ResultSet contient une méthode, fetch_assoc qui retourne un tableau associatif contenant les champs de la prochaine ligne de résultat, ou false s'il n'y a plus de résultat.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

3

Ok Merci.
Je n'aprouve pas non plus le decoupage des classes de l'url que j'ai donnéewink

Sinon Pour une detection des personnes connectées, je suppose qu'il faut détecter quand l'explorateur ferme la fenetre ou change de page non?

4

Je ne sais pas si ça peut être détecté (au niveau du serveur). Peut-être qu'on peut bidouiller ça avec du javascript, mais ça m'étonnerait.
Pour yN il me semble que le procédé est le suivant : lorsque tu fais une requête au serveur, celui-ci t'identifie grâce à ta session, et note l'heure à laquelle tu as fait ta requête. Si 5 minutes plus tard tu n'as toujours pas fait d'autre requête, tu es considéré comme déconnecté.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

5

Ne serait il pas plus utile d effectue un mysql_pconnect?

6

1/ pconnect est souvent bindé en connect sur les hébergeurs. Les pconnect sont de vraies plaies pour les hébergeurs mutualisés d'ailleurs.
2/ utilise plutôt une bibliothèque d'abstraction de connexion à un SGBD, comme adodb, pour la portabilité, c'est mieux smile
avatar
Il n'a pas de mots
Décrire son mépris
Perdre les rênes
Il a perdu la foi