Spécifier une action pour un utilisateur

Par JoHuv, il y a 8 ans


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

Laznet, il y a 8 ans

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, il y a 8 ans

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 ?

Laznet, il y a 8 ans

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, il y a 8 ans

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

Laznet, il y a 8 ans

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

JoHuv, il y a 8 ans

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 !

Laznet, il y a 8 ans

Peut être "$this->User"

JoHuv, il y a 8 ans

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

Carouge10, il y a 8 ans

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.

Lartak, il y a 8 ans

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, il y a 8 ans

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...

Carouge10, il y a 8 ans

ça ne saurai pas plutôt ceci:

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

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.

JoHuv, il y a 8 ans

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 !

Lartak, il y a 8 ans

De rien, avec plaisir.