[RESOLU] Récupérer variables Session (PDO), problème

Eléphant du PHP | 55 Messages

15 août 2013, 20:27

Bonjour,
Je suis en train de créer une page d'authentification pour un backoffice.
Je suis parvenu à créer la demande sur ma page de connexion qui a 2 champs identifiant et mdp.
Si les données ne correspondent pas ma page n'affichera pas le menu du backoffice par contre si c'est correct j'y accèderais.
Le problème est lorsque je suis sur ma 2ème page, celle qui administre le menu du backoffice, je peux y accéder par l'url. Je souhaiterais que la page soit redirigée vers ma page de connexion automatiquement. Mais je ne sais comment faire. Quelqu'un peut-il m'aider et m'expliquer un peu en détail car je ne comprends pas bien les sessions.
Code de la page 1 de cnx:
session_start(); 
//J'ai mis le lien pour la cnx à la bdd
if(!empty($_POST)){
	$login=$_POST['login'];
	$pass=$_POST['pass'];
		
	$q=array('login'=>$login,'pass'=>$pass);
	$sql='SELECT login,pass FROM useradmin WHERE login=:login and pass=:pass';
	$req=$b2d->prepare($sql);
	$req->execute($q);
	$count=$req->rowCount($sql);

	if($count==1){
		// Vérifier si l'utilisateur existe
		$_SESSION["authentif"]=array(
		'login'=>$login,
		'pass'=>$pass);
		header('Location:admin.php');
 	}
}
Sur la page de gestion du BO - j'ai mis ce code mais ça ne fonctionne pas
session_start();  
	if (!isset($_SESSION["authentif"])){
       header ('Location:../ConnexionBO.php');
  } 

Merci par avance
Ionesco

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

15 août 2013, 22:46

Salut,

Sur le principe ton code semble bon.

Ajoute un espace après le : dans le header ça peu joueur un peu.

Sinon as tu essayé d'ajouter un var_dump($_SESSION); avant le header (que tu met en commentaire) pour voir ce que tu as en session.

Pour le code de connexion, tu peux passer directement $_POST à la méthode exécute (vu qu'à priori tu n'a que ces deux champs).

Ne met pas le mot de passe en session c'est inutile. Tu peux très bien ne mettre que le pseudo (et la clef primaire correspondante si tu en as besoin cela évite de la chercher).

Peux tu nous en dire plus sur ton problème ?
La redirection est faite touts le temps ?
Elle n'est jamais faite ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

16 août 2013, 11:34

Bonjour,
Merci pour ces informations. J'ai effectué un var_dump($_SESSION) pour la page d'administration. Ça n'a fonctionné qu'une fois ensuite rien ne s'affichait. Mais la première fois, le message indiquait empty, size 0. Je ne sais pas pourquoi le var_dump ne fonctionne pas.
Mon problème est au niveau de la sécurité. Je pensais qu'en mettant une session, je ne pourrais pas aller directement sur ma page d'administration via l'url sans que me soit demandé les codes d'accès. Or j'y arrive directement.
Est-ce possible de l'éviter? Comment dois-je configurer la page d'administration pour qu'elle me redirige sur la page d'authentification si je n'ai pas saisi les codes si je tape l'adresse de cette page directement dans l'url?

Si je passe par la page d'authentification, saisis les codes la redirection se fait bien.
Si je passe directement par la page d'administration, le backoffice apparaît, je ne suis pas redirigé vers la page authentification, ce que je souhaite.
Comment dois-je procéder? Dois-je écrire différemment la session?

Pour ce qui est de la partie execute, je n'ai vraiment compris.

Cdlt,
Ionesco

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

16 août 2013, 12:35

post le code complet de la page du backoffice (enlève les éventuels utilisateurs mot de passe)

si var_dump($_SESSION); affiche empty c'est que soit la session n'est pas demarrée, soit il n'y a rien en session (écrasement ou autre.

tu n'as de pas session_destroy() qui traine ?

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

16 août 2013, 13:25

Dans la page de la gestion du backoffice, je n'ai rien de plus qu'une partie en html/css et un simple déconnexion. C'est peut-être la raison pour laquelle la session ne prend pas, je dois davantage développer?
Comment démarrer la session dans cette page de backoffice?
Je n'ai pas de session_destroy().
Cdlt,
Ionesco

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

16 août 2013, 19:03

si, au debut de ta page tu as
<?php
session_start();  
if (!isset($_SESSION["authentif"])){ // tu peux aussi mettre empty
    header ('Location: ../ConnexionBO.php');
} 
Et que tu n'as rien avant tu doit être redirigé si la variable de session n'existe pas.

si tu met
<?php
session_start();  
var_dump($_SESSION);
if (!isset($_SESSION["authentif"])){ // tu peux aussi mettre empty
    // header ('Location: ../ConnexionBO.php');
} 


tu doit voir ce qu'il y a dedans.
Dans le cas d'un accès sans être connecté un empy array
Dans le cas d'un accès connecté un tableau avec les infos qu'il y a dedans.


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

21 août 2013, 15:11

Bonjour,
J'ai testé. En effet, lorsque je saisis les bons identifiants je suis redirigé sur la page qui gère le menu du BO. Quand je me déconnecte, il garde en mémoire le login. Donc lorsque j'accède à cette page via l'url, mon login est toujours en mémoire (testé grâce var_dump que j'ai ajouté). Comment faire pour que ma session soit détruite ?

Dans ma page de gestion du backoffice j'ai mis:
<?php
session_start(); 
if(!isset($_SESSION["authentif"])){
header('Location:../ConnexionBO.php');
}
//deconnexion
if(isset($_GET['logout'])){
header('Location:../ConnexionBO.php');
session_destroy(); 
}
?>
 
J'ai le sentiment que session_destroy() n'est pas pris en compte puisque ma session est maintenue. Où placer cette ligne de code pour qu'elle soit fonctionnelle?
PS: lorsque je ferme le localhost et le rouvre, que je me mets directement sur la page de gestion du BO, je suis redirigé sur la page des identifiants. Donc ça fonctionne mais pas si le serveur en local reste ouvert.
Merci par avance
Ionesco

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

22 août 2013, 21:44

salut,

suis la logique de ton code et tu aura la réponse ;)

// si logout existe dans l'url
if(isset($_GET['logout'])){
// je vais sur ConnexionBO.php
header('Location:../ConnexionBO.php');
// le reste est ignoré vu que je partis sur une autre page !
session_destroy();
}

du coup le session_destroy est a mettre avant le header.

d'ailleurs, généralement la seule instruction que l'on trouve après ce type de header (location) c'est un exit().


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

23 août 2013, 02:14

Bonsoir Moogli,
Je comprends mais en fait je crois savoir pourquoi cela ne fonctionne toujours pas lorsque je me déconnecte. Est toujours gardé en mémoire la session. Mon code dans le HTML pour la déconnexion est le suivant:
<a href="ConnexionBO.php?logout=ok">SeDéconnecter</a>
Ce n'est pas dans un formulaire dont le get ne peut être récupéré si je ne me trompe pas.
J'ai essayé aussi
<input type="submit" value="logout"/> 
au lieu du code ci-dessus mais je n'ai toujours pas la suppression de la session.
J'ai aussi déplacé session_destroy() et l'ai mis devant le header. Toujours pas résolu.
Mais est-ce possible?
Merci par avance pour toutes tes réponses, elles m'aident à avancer.
Cdlt,
Ionesco

ViPHP
xTG
ViPHP | 7331 Messages

23 août 2013, 07:19

En suivant l'indice de Moogli ton code est bon.
Ton lien transmet bien une variable par GET (pas besoin de formulaire).

Sauf qu'à voir ton lien et tes headers je me dis... Appelles-tu bien la bonne page dans ton lien ?

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

23 août 2013, 10:22

J'ajouterais qu'il faut debugger,

Met en commentaire les header, ajoute un var_dump($_SESSION, $_GET); après le session_start() histoire de voir ce qu'il y a dans ces variables:)

Sinon le code semble fonctionnel.

Tu n'es pas obligé de détruire la session, tu peux simplement supprimer l'index du tableau qui te sert à vérifier l'authentification ;)


@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

23 août 2013, 17:56

Bonjour,
Je progresse grâce à vos réponses. J'ai fait le test de var_dump($_GET) et j'obtiens: array (size=0) empty.
J'avais mis comme code dans mon HTML
<a href="ConnexionBO.php?logout=ok">SeDéconnecter</a>
Et en php
if(isset($_GET['logout'])){
	session_unset(); 
}
J'ai également essayé
unset($_SESSION['authentif']); 
mais toujours le même problème.
Comme dans mon code HTML, je n'ai rien pour récupérer le GET, cela expliquerait pourquoi mon array est vide, non?
Pourrais-tu m'expliquer pourquoi stp?
To Moogli:
Je ne sais pas comment on supprime l'index d'un tableau mais je veux bien que tu me souffles la réponse, je suis partant.
Je suis un peu perdu. Voyant qu'avec le submit ça ne fonctionnait pas, j'ai mis ce code à la place:
<a href="ConnexionBO.php?logout=ok">SeDéconnecter</a></li>
Pas mieux. Ca rend chèvre parfois de coder... #-o
Cordialement à tous
Ionesco

ViPHP
xTG
ViPHP | 7331 Messages

24 août 2013, 07:17

Je ne sais pas comment on supprime l'index d'un tableau mais je veux bien que tu me souffles la réponse, je suis partant.
C'est le code du unset que tu utilises qui permet cela. ;)

Tu as un var_dump qui renvoie vide ? Et qu'as-tu dans l'url à ce moment là ?
N'aurais-tu pas une réécriture d'url qui te perdrais les paramètres GET ?

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

24 août 2013, 10:48

Code a tester sur la page cible (connexionbo)
<?php
session_start();
var_dump($_SESSION,$_GET);
exit();
Poste le résultat.

@+
Il en faut peu pour être heureux ......

Eléphant du PHP | 55 Messages

29 août 2013, 20:08

Bonjour,
Me revoilà. J'ai trouvé une solution intermédiaire.
J'ai supprimé cette partie dans ma page de gestion
if(isset($_GET['logout'])){
        session_unset();
        header('Location:../ConnexionBO.php');
        
}
J'ai dans mon formulaire créer une nouvelle page et donc changé le lien comme suit:
<a href="SeDeconnecter.php?logout=ok">SeDéconnecter</a>
Et dans cette nouvelle page SeDeconnecter.php, j'ai mis le code suivant:
<?php
session_start(); 
session_destroy(); 
header('Location:ConnexionBO.php'); 
?>
Ainsi, même si je saisis le nom de ma page de gestion directement dans l'url, on est redirigé vers le formulaire de connexion.
Ça marche. Est-ce que du point de vue du développement c'est correct?
Merci par avance,
Cdlt
Ionesco