8796 sujets

Développement web côté serveur, CMS

bonjour, je développe un site web dynamique pour une entreprise qui sera exploité en intranet seulement, je suis en train de le développer en php, c'est un site web d'informations et de procédures mettant en interaction les différents départements sur le plan informationnel.
le site web en question comporte des session et des rôles d'accès suivant les utilisateurs, jusque là tout va bien. j'ai mis un truc d'aiguillage pour permettre a chacun d'accéder a sa session. le problème est que j'accède seulement en tant que administrateur. pour les autres users ça ne marche pas. je ne sais pas si ça avoir avec le mysql ou le code que j'ai mis pour l'aiguillage. svp j'aimerai avoir des indications pour palier a ce problème et merci d'avance.
Modifié par brainsplit (27 Sep 2010 - 17:32)
Salut,

je ne vois pas comment on pourrait t'aider sans aucune info. Smiley rolleyes

Le mieux serait de regarder tes logs (Apache / PHP / Mysql).
j'ai une base de donnée nomée 'dda' qui contient deux table une pour les "session" qui contient ( 'login' ,'password' et 'role') et l'autre pour la sauvegarde des informations des "utilisateur" (nom, prénom, département,etc.).

au départ j'ai crée 5 sessions avec des rôles spécifique a chacun suivi des users, jusque là tout va bien, les users ont accès a leurs pages respectives, mais lorsque j'essaie d'en ajouter d'autres ça ne marche pas et je ne sais pas où ça ne va pas.

je vais vous donner le code que j'ai mis:


<?php
function code_erreur($erreur)
{
    $code=fopen('code.txt','r+');
    fputs($code, $erreur);
    fseek($code,0);
    fclose($code);
}
if(empty($_POST['login']))
{
    if(empty($_POST['pwd']))
{
    code_erreur(1);
    echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
}
    else
	{
	code_erreur(2);
	echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
	}
}
else
	{
	if(empty($_POST['pwd']))
	{
	code_erreur(3);
	echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
	}
	else
	{
	require 'connexion.php';
	$res=mysql_query("SELECT * FROM `session` LIMIT 0 , 500");
	$total=mysql_num_rows($res);
	if($total)
	{
	while($ligne=mysql_fetch_array($res))
		{
	        $login_valide=$ligne[0]; 
		$pwd_valide=$ligne[1];	
		$role=$ligne[2];	
		if(isset($_POST['login']) && isset($_POST['pwd']) )
			{
			if ($login_valide == $_POST['login'] && $pwd_valide == $_POST['pwd']) 
				{ 
				session_start (); 
				$_SESSION['login'] = $login_valide; 
				$_SESSION['pwd'] = $pwd_valide; 
				$_SESSION['role']=$role;	
				//aiguillage
				if($_SESSION['role']=="finances") 
                                  header('location:retour.php');//creer des dossiers de cette forme /departement/pages.php
			if($_SESSION['role']=="energies") 
							        header('location:retour.php');/////////////////////////////////////////////////////
		         if($_SESSION['role']=="ressources humaines") ///////////////////////////////////////////////
header('location:retour.php');	////////////////////////////////////////////////////
			if($_SESSION['role']=="travaux neufs")////////////////////////////////////////////////
header('location:retour.php');
         		if($_SESSION['role']=="maintenance")
header('location:retour.php');	
			if($_SESSION['role']=="administrateur")
header('location:retour.php');	
// liens vers la page qui correspond au membre				
}
else
{
if(($_POST['login']==$login_valide) && ($pwd_valide != $_POST['pwd']))
{
	code_erreur(4);
// puis on le redirige vers la page d'accueil 
echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
}
else
{
if(($_POST['pwd']==$pwd_valide) && ($login_valide != $_POST['login'] ))
{
	code_erreur(5);
	echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
}
else
{	
	code_erreur(6);
	// puis on le redirige vers la page d'accueil 
        echo '<meta http-equiv="refresh" content="0;URL=Energies.html">';
}
}
}
}
else
{
header ('location: Energies.html');		
}
}
}
else
	{ 
	echo 'la base de donn&#65533;es ne contient auscun utilisateur!';  
	}  

}

}
?> 
Hem... quel drôle de code. Smiley murf

Déjà, pour toi et pour ceux qui le reliront, c'est quand même plus clair de l'indenter correctement (et plus encore quand on ne met pas toutes les accolades facultatives).

Ensuite (dans le désordre) :
* pourquoi est-ce que tu fais parfois un un vilain meta refresh et à d'autres moments un joli header ?
* je suppose que le fichier code.txt est temporaire (puisque tu as dû le créer à la main et que tu écrases à chaque fois son contenu avec un nouveau code erreur) mais alors pourquoi ne pas faire tout simplement un exit ?
* puisque le login et le password sont obligatoires quel est l'intérêt d'avoir tous ces niveaux d'erreurs (login vide et password vide / login vide et password non vide / login non vide et password vide) ?
* pourquoi, après avoir bien vérifié qu'ils n'étaient pas vides, refais-tu un test
if(isset($_POST['login']) && isset($_POST['pwd']) ) ?
* pourquoi lire les 500 premiers enregistrements de la table session (pourquoi 500 d'ailleurs ?) et vérifier pour chaque enregistrement s'il correspond aux login/password ? Ce serait quand même plus logique et plus rapide de les rajouter en clause WHERE dans ta requête.
* la structure de ta table est comme suit :
1. login
2. password
3. role
ce qui est une mauvaise idée pour plusieurs raisons.
> d'abord parce qu'on préconise d'utiliser un identifiant unique (INT en auto_increment généralement) et qu'en l'état rien n'est moins sûr : as-tu une clé unique sur login / password (et éventuellement role) ?
> parce que les champs login / password devraient logiquement être rattachés à la table utilisateurs
> quant au champ role soit un utilisateur ne peut en avoir qu'un et un seul (ce qui semble être le cas) et alors il devrait également être rattaché à la table utilisateurs, soit un utilisateur peut en avoir plusieurs et il faudrait une autre table utilisateur_role. On peut également supposer que plusieurs utilisateurs aient le même "role" et dans ce cas il faudrait créer une table roles dont l'identifiant se retrouverait en clé étrangère de la table utilisateurs.
> pour finir le fait de créer cette table roles va te permettre de supprimer ces vilains tests en dur dans le code (if role == xxx alors header yyy) puisqu'il suffira d'y rajouter le champ url.

Au final ça pourrait donner quelque chose comme ça :
CREATE TABLE roles (
  id_role int(10) unsigned NOT NULL auto_increment,
  libelle text NOT NULL,
  url text NOT NULL,
  PRIMARY KEY  (id_role)
) AUTO_INCREMENT=7 ;

-- 
-- Contenu de la table 'roles'
-- 

INSERT INTO roles (id_role, libelle, url) VALUES 
(1, 'finances', 'finances.html'),
(2, 'énergies', 'energies.html'),
(3, 'ressources humaines', 'ressources.html'),
(4, 'travaux neufs', 'travaux.html'),
(5, 'maintenance', 'maintenance.html'),
(6, 'administrateur', 'administrateur.html');

-- --------------------------------------------------------

-- 
-- Structure de la table 'utilisateurs'
-- 

CREATE TABLE utilisateurs (
  id_user int(10) unsigned NOT NULL auto_increment,
  nom text NOT NULL,
  prenom text NOT NULL,
  login text NOT NULL,
  `password` text NOT NULL,
  id_role int(10) unsigned NOT NULL,
  PRIMARY KEY  (id_user)
) AUTO_INCREMENT=1 ;


<?php
// Initialisation ou récupération des variables
$login = !empty($_POST['login']) ? trim($_POST['login']) : '';
$pwd = !empty($_POST['pwd']) ? trim($_POST['pwd']) : '';

$erreurs = array();

if($_SERVER['REQUEST_METHOD']=='POST') {
	// login obligatoire
	if(empty($login)) {
		$erreurs[] = 'Le login est requis.';
	}
	// password obligatoire
	if(empty($pwd)) {
		$erreurs[] = 'Le password est requis.';
	}
	// pas d'erreur
	if(empty($erreurs)) {
		// Vérification du couple login / password
		require 'connexion.php';
		$sql = sprintf("SELECT url FROM utilisateurs Natural Join roles WHERE login='%s' AND password='%s'",
			mysql_real_escape_string($login),
			mysql_real_escape_string($pwd));
		$result = mysql_query($sql) or die(mysql_error());
		if(mysql_num_rows($result) < 1) {
			$erreurs[] = 'Login et/ou Password incorrect(s).';
		} else {
			header('Location: '. mysql_result($result, 0) );
		}
	}
}
?><!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" />
<title>Connexion</title>
<style type="text/css" media="screen">
.alerte {
	color: #FF0033;
	font-weight: bold;
}
</style>
</head>
<body>
<?php
if(!empty($erreurs)) {
	foreach($erreurs as $erreur) {
		echo '<p class="alerte">'.$erreur."</p>\n";
	}
}
?>
<form action="<?php echo $_SERVER['SCRIPT_NAME']; ?>" method="post">
	<p>
		<label for="login">Login : </label>
		<input type="password" name="login" id="login" value="<?php echo htmlspecialchars($login); ?>" />
	</p>
	<p>
		<label for="pwd">Password : </label>
		<input type="password" name="pwd" id="pwd" value="<?php echo htmlspecialchars($pwd); ?>" />
	</p>
	<p>
		<input type="submit" value="Se connecter" />
	</p>
</form>
</body>
</html>
merci infiniment pour toutes vos remarques et conseils ça ma fait voir mieux surtout coté logique Smiley confused .
je vais essayer avec ça. encore une fois merci.