Bonjour,

J'essaie de demander une action particulière si un utilisateur spécifique qui se connecte.

Dans les faits, je souhaite une première "barriere sécurité": j'ai créé un identifiant que je donnerais personnellement à ceux qui auront le droit de se connecter à mon site. Et ce, pour être sûr que seules les personnes choisies (que je connais personnellement) s'inscrivent. Je l'ai nommé "bienvenue".
Je souhaite que les personnes se connectant à ce compte (donc ayant le login et le mot de passe) soient directement redirigées sur la page "register" afin qu'ils puissent créer leur propre login et mot de passe.

Seulement, j'émais beaucoup de difficulté à cause de mon très faible niveau en programmation. Je n'ai pas de message d'erreur, mais ça ne redirige rien:
voilà ce que j'ai fait sur ma page "default":

require_once CORE.DS.'func.php';
if(isset($_SESSION['auth'])){
require ROOT.DS.'view'.DS.'pages'.DS.'actu.php';

}else{
/**
* partie se connecter
**/
    if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
        require_once CORE.DS.'db.php';
        $req = $pdo->prepare('SELECT * FROM users WHERE (username = :username OR email = :username) AND confirmed_at IS NOT NULL');
        $req->execute(['username' => $_POST['username']]);
        $user = $req->fetch();

        if(password_verify($_POST['password'], $user->password)){
        $_SESSION['auth'] = $user;
        $_SESSION['flash']['defaut'] = 'Vous êtes maintenant connecté';

    $userFirst = $this->User = 'bienvenue';           
    if($_SESSION['auth'] = $userFirst){
        header('Location: http://localhost:8080/.../pages/register');
        $_SESSION['flash']['success'] = 'Merci de vous enregistrer';      
    }

Sachantque je fais une erreur dans la logique, j'ai essayé d'autres façon, et rien ne se passe.
Il y aurait-il quelqu'un qui pourrait m'aiguiller ? ou peux -t-être une autre façon de procéder pour arriver à un résultat sensiblement pareil à ce que je souhaite ?
Merci de votre aide.

15 réponses


Carouge10
Réponse acceptée

ça ne saurai pas plutôt ceci:

if($_SESSION['auth']->username == 'bienvenue'){
  header('Location: http://localhost:8080/.../pages/register');
  exit();
}
Lartak
Réponse acceptée

Ce n'est pas possible l'égalité que tu demandes, étant donné que tu lui demandes de comparer une chaîne de caractères avec un objet.
Il te faut plutôt faire :

if ($_SESSION['auth']->username == $userFirst) {
    header('Location: http://localhost:8080/.../pages/register');
    exit();
}

Par contre, avec ton code actuel, tous les utilisateurs auront bienvenue comme username.

Bonjour,

Tu peux tout simplement gérer les différents cas avec des if (ou dans l'idée où il y a plusieurs cas tu peux utiliser des switch). De cette façon tu peux tester les logins qui ont le droit ou non de se connecter.

En espérant que ça puisse t'aider, peut être que j'ai mal compris ta question.

JoHuv
Auteur

Bonjour, merci de ta réponse.
C'est justement ce que j'essaie de faire avec

$userFirst = $this->User = 'bienvenue';           
if($_SESSION['auth'] = $userFirst){
    header('Location: http://localhost:8080/.../pages/register');
    $_SESSION['flash']['success'] = 'Merci de vous enregistrer'; 

Mais visiblement, je ne parviens pas à rediriger. Où est mon erreur ?

En PHP pour tester l'égalité de deux variable il faut mettre deux égal (ou 3 pour dire "strictement égal à..", mais dans ton cas 2 égal suffissent).

<?php
if($_SESSION['auth'] = $userFirst){ //Ici il faut mettre un autre égal :D
?>
JoHuv
Auteur

Ha oui ! j'en ai oublié un. Mais je n'ai pas de redirection... il doit se cacher une autre erreur..

Essayes de voir ce que contient ta SESSION.. peut être que ça vient de là..

JoHuv
Auteur

En faisant un var_dump de $_session, il me sort ceci:

array (size=2)
'auth' => 
object(stdClass)[14]
  public 'id' => string '6' (length=1)
  public 'login' => null
  public 'username' => string 'bienvenue' (length=9)
  public 'email' => string 'serveur@johuv.fr' (length=16)
  public 'password' => string '$2y$10$QUG7eNffRYMPD8flyK4W6uXsWaX27.DLYB/Bg68T/N8MGukJBA.aq' (length=60)
  public 'role' => string 'invitealaconnection' (length=19)
  public 'confirmation_token' => string 'R8IVPjpoGgFw3ulq0HtjVwB7fl4HzuGaFAlFsGT01bYre3KJR13Ur2GUhrJT' (length=60)
  public 'confirmed_at' => string '2017-07-16 00:00:00' (length=19)
  public 'reset_at' => null
  public 'reset_taken' => string '' (length=0)
  public 'remember_token' => string 'R8IVPjpoGgFw3ulq0HtjVwB7fl4HzuGaFAlFsGT01bYre3KJR13Ur2GUhrJT' (length=60)
'flash' => 
array (size=1)
  'defaut' => string 'Vous êtes maintenant connecté' (length=31)

Il me sort ce qu'il faut depuis le phpmyadmin...
Je peux en conclure que mes lignes

    $userFirst = $this->User = 'bienvenue';           
    if($_SESSION['auth'] = $userFirst){
    header('Location: http://localhost:8080/.../pages/register');
    $_SESSION['flash']['success'] = 'Merci de vous enregistrer';      
    }

sont fausses ou/et ne sont pas traitées... là je sèche !

Peut être "$this->User"

JoHuv
Auteur

J'ai changé de formule une 100ene de fois... je ne sais plus quoi essayer...

Bonsoir,

1/ Une comparaison se fait toujours par == ou === .
2/ Il vaut mieux éviter de mettre du code après un header("Location....."); car le code qui suit ne sera pas éxécuter.
C'est pour cela qu'on met un exit(); juste après.

Bonsoir.
Ta dernière condition, soit : if($_SESSION['auth'] = $userFirst){ ne sera jamais valide étant donné que l'index auth de ta session contient un objet alors que ta variable userFirst contient une chaîne de caractères (string).
De ce fait, la redirection ne peut pas être prise en compte.

JoHuv
Auteur

Après un dernier

if($_SESSION['auth'] == 'bienvenue'){
  header('Location: http://localhost:8080/.../pages/register');
  exit();
}

je ne vois comment remédier.

Selon toi , Lartak, quelle doit être la forme ?
Je veux que "si 'auth' = 'bienvenue', alors 'register.php'

Je suis totalement perdu...

JoHuv
Auteur

Merci mille fois à vous deux ! Je tournais autour de la solution et vous m'avez fait comprendre ce soucis et résolu un problème qui me taraude depuis plus de 8 jours !
La solution est

if($_SESSION['auth']->username == 'bienvenue'){
    header('Location: http://localhost:8080/.../pages/register');
    exit();
    }

Vous êtes au top !

De rien, avec plaisir.