authorisation admin class.auth.php

valdsr
Invité n'ayant pas de compte PHPfrance

11 sept. 2011, 10:53

Bonjour, tous! J-ai un souci que je n'arrive pas à résoudre,
j'ai fais suivi un tutorial sur grafikart sur la création d'une page membre et admin
j'ai posé déjà la question sur ce forum
http://www.grafikart.fr/forum/topic/2360
mais n’ayant pas eu de réponse je post donc mon problème.
voilà j'ai tout comme il faut mais la page admin est supposé ne pas étre accessible mais ce n'est pas le cas, je peux y accéder meme si je ne suis pas logguer, et en étant membre simple je peux aussi logguer à cette page. Voici mes codes (tout dans le meme dossier):
la page index.php :
<?php
session_start();

try{
  $PDO = new PDO('mysql:host=localhost;dbname=tuto','root','');
  $PDO->setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_WARNING);
  $PDO->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE,PDO::FETCH_OBJ);
}catch(PDOException $e){
  echo'Connexion impossible';
}
  
  

//Class Auth
require_once "class.auth.php";

ob_start();
include((isset($_GET['p'])?$_GET['p']:'home').'.php');
$content_for_layout = ob_get_clean();
?>
<!DOCTYPE html PUBLIC "-/W3C/DTD XHTML 1.0 Strict/EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"/>
</head>

<body>
<div id="conteneur">
<?php if($Auth->user("id")):?>
<h1>Bonjour<?php echo $Auth->user('login');?></h1>
<ul>
  <li><a href="index.php?p=compte">Mon compte</a></li>
  <?php if($Auth->user("slug")=='admin'):?>
  <li><a href="index.php?p=admin">Administration</a></li>
  <?php endif; ?>
  <li><a href="index.php?p=logout">Déconnecter</a></li>
</ul>
<?php else:?>
<a href="index.php?p=login">Se connecter</a>
<?php endif;?>
  <?php echo $content_for_layout;?>
  <pre><?php print_r($_SESSION); ?></pre>
  </div>
  </body>
  
  
  

la page login.php
<?php 
if(!empty($_POST)){
  if($Auth ->login($_POST)){
  
  }else{
    echo "Mauvais identitifants";
   }
  }
 ?>

<form method="post" action="index.php?p=login">
  <label for="">Login: </label>
  <input type="text" name="login"/>
  <label for="">Mot de passe: </label>
  <input type="text" name="password"/>
  <input type="submit" value="se connecter"/>
 </form>
la page class.auth.php
<?php class Auth{
 
  var $forbiddenPage = "index.php?p=forbidden";
 
  /**
  *Permet d'identifier un utilisateur.
  **/
     function login($d){
     global $PDO;
     $req = $PDO->prepare('SELECT users.id,users.login,users.address,roles.name,roles.slug,roles.level FROM users LEFT JOIN roles ON users.role_id=roles.id WHERE login=:login AND password=:password');
     $req->execute($d);
     $data = $req->fetchAll();
     if(count($data)>0){
           $_SESSION['Auth'] = $data [0];
           return true;
     }
     return false;
   }
 
   /**
   *Autorise un rang à accéder à une page, redirige vers forbidden sinon
   **/
    
   function allow($rang){
     global $PDO;
     $req = $PDO->prepare('SELECT slug,level FROM roles');
     $req->execute();
     $data = $req->fetchAll();
     $roles = array();
     foreach($data as $d){
        $roles[$d->slug] = $d->level;
		}
		
     if(!$this->user('slug')){
         $this->forbidden();
		 		
     }else{
          
     if($roles[$rang]> $this->user('level')){
        $this->forbidden();
		
      }else{
        return true;
      }
     }
 
   }
    
   /**
   *Récupère une info utilisateur
   **/
   function user($field){
         if(isset($_SESSION['Auth']->$field)){
         return $_SESSION['Auth']->$field;
     }else{
       return false;
     }
   }
    
   /**
   *Redirige un utilisateur
   **/
   function forbidden(){
        header('Locaton:'.$this->forbiddenPage);
   }
    
}
 
$Auth = new Auth();
?>
et la page admin.php
<?php $Auth -> allow('admin');?>
<p>ADMIN</p>
la base de donné c'est 2 tableaux
roles
id name slug level
1 Administrateur admin 2
2 Membre member 1
users
id login password address role_id
1 admin admin Je suis un admin 1
2 membre membre pti membre 2


voilà j’espère pas avoir était trop long
je pense que c'est au niveau du class.auth.php que c'est pas bien configurer ou bien c'est un problème de configuration de mon server
peut-étre aussi au niveau du pdo ? je ne suis que débutant :oops:
merci beaucoup d'avance

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

11 sept. 2011, 12:38

Je n'ai pas tout regardé en détail, mais tu as déjà une erreur dans ta méthode forbidden :
 header('Locaton:'.$this->forbiddenPage);
devrait être :
 header('Location:'.$this->forbiddenPage); // Locat-i-on
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Petit nouveau ! | 3 Messages

11 sept. 2011, 12:49

MERCI C'était juste ça désolé d'avoir perturbé le forum
merci enormement j'ai passé des heures à eessayer de débuger , !! tu me sauves la vie !! je t'adore!!

ViPHP
AB
ViPHP | 5818 Messages

11 sept. 2011, 18:06

Au passage, prends la bonne habitude me mettre un exit suite à un header de redirection (cf exemple 4), cela t'évitera parfois des résultats inattendus.
   function forbidden(){
        header('Location:'.$this->forbiddenPage);
        exit;
   }