Bonjour. J'ai ajouté une condition supplémentaire pour permettre le login dans la Gestion de l'espace membres comme ceci: Si le membre est indiqué 0 à actif dans la TABLE users, il ne peux pas se connecter. Si c'est à 1, il peut.

function logged_only(){ if(session_status() == PHP_SESSION_NONE){ session_start(); } if(!isset($_SESSION['auth']) || $_SESSION['auth']->actif===0 ) { $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page"; header('Location: login.php'); exit(); } }

Pourtant ¸ $_SESSION['auth']->actif indique si c'est 0 ou 1 avec var_dump().

Je voudrais que si c'est 0 que le membre ne puisse pas se connecter.

Probable que ce soit dans ma condition l'erreur avec && ou === Ou encore, je fais fausse route.

Ce que j'obtiens, il peut tout le temps se connecter que je mette 0 ou 1.

Dans ma TABLE bdd, le champ est : nom du champ: actif type : tinyint(1) Valeur par défaut: 0 Null : Non

8 réponses


Hello :)

Alors au lieux de faire $_SESSION['auth']->actif === 0, essayes !$_SESSION['auth']->actif, c'est comme ça que doit être traité un boolean

En gros un truc commme ça

function logged_only()
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }

    if (!isset($_SESSION['auth']) || !$_SESSION['auth']->actif ) {
        $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page";
        header('Location: login.php');
        // exit() ne sert a rien, tu déclenches un header location donc le exit ne sera pas déclenché
    }
}

En principe ça devrait être bon, fais voir le code où tu appelles cette fonction?

Ah et si tu as PHP8, tu peux faire ça:

function logged_only()
{
    if (session_status() == PHP_SESSION_NONE) {
        session_start();
    }

    if (!$_SESSION['auth']?->actif ) { // petit helper PHP8, si auth existe il pointe vers actif, si il n'existe pas il renvoie null au lieux de faire une erreur
        $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page";
        header('Location: login.php');
    }
}
Dan H
Auteur

PHP 7.4

Le fichier LOGIN..PHP
`<?php
require_once 'inc/functions.php';
reconnect_from_cookie();
if(isset($_SESSION['auth']) && $_SESSION['auth']->actif){
header('Location: account.php');
exit();
}
if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
require_once 'inc/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']['success'] = 'Vous êtes maintenant connecté';
if(isset($_POST['remember'])){
$remember_token = str_random(250);
$pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'ratonlaveurs'), time() + 60
60 24 7);
}
header('Location: account.php');
exit();
}else{
$_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
}
}
?>
<?php require 'inc/header.php'; ?>

<h1>Se connecter</h1>

<form action="" method="POST">

    <div class="form-group">
        <label for="">Pseudo ou email</label>
        <input type="text" name="username" class="form-control"/>
    </div>

    <div class="form-group">
        <label for="">Mot de passe <a href="forget.php">(J'ai oublié mon mot de passe)</a></label>
        <input type="password" name="password" class="form-control"/>
    </div>

    <div class="form-group">
        <label>
            <input type="checkbox" name="remember" value="1"/> Se souvenir de moi
        </label>
    </div>

    <button type="submit" class="btn btn-primary">Se connecter</button>

</form>

<?php require 'inc/footer.php'; ?>`

Appelle logged_only() dans le fichier functions.php

Si actif est 1 et que les identifiants sont bon, ça va dans ACCOUNT.PHP:

require 'inc/functions.php'; logged_only();

Un autre problème se pose, sans être connecter parce que "actif" est à 0,
c'est comme si j'étais connecté puisque j'ai le bouton "Se déconnecter".

Proable que ce soit cette portion de code qui est problème :
La partie "Se déconnecter"

<?php if (isset($_SESSION['auth'])): ?> <li><a href="logout.php">Se déconnecter</a></li> <?php else: ?> <li><a href="register.php">S'inscrire</a></li> <li><a href="login.php">Se connecter</a></li> <?php endif; ?>
La source est dans les Tutos ici à "Gestion de l'espce membres".
Que je tente d'adapter à mes besoins en ajoutant "Actif" et intégrer
à mon projet.

Dan H
Auteur

Correction: pas résolu, ça ne fonctionne pas. J'ai toujours "Se déconnecter".

J'ai résolu en ajoutant dans la partie "Se déconnecter" ceci:

|| isset($_SESSION['auth']->actif)

Il est à quel endroit le bouton résolut?
Si jamais je fais erreur, je suis ouvert à toute suggestion.

Dan H
Auteur

J'ai annulé toute la partie "Actif" parce que je n'ai pas de solution.

Je reposte ça en propre déjà ^^

<?php
    require_once 'inc/functions.php';
    reconnect_from_cookie();
    if(isset($_SESSION['auth']) && $_SESSION['auth']->actif){
        header('Location: account.php');
        exit();
    }

    if(!empty($_POST) && !empty($_POST['username']) && !empty($_POST['password'])){
        require_once 'inc/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']['success'] = 'Vous êtes maintenant connecté';

            if(isset($_POST['remember'])){
                $remember_token = str_random(250);
                $pdo->prepare('UPDATE users SET remember_token = ? WHERE id = ?')->execute([$remember_token, $user->id]);
                setcookie('remember', $user->id . '==' . $remember_token . sha1($user->id . 'ratonlaveurs'), time() + 60 60 24 7);
            }

            header('Location: account.php');
            exit();
        } else {
            $_SESSION['flash']['danger'] = 'Identifiant ou mot de passe incorrecte';
        }
    }
    ?>

    <?php require 'inc/header.php'; ?>

    <h1>Se connecter</h1>

    <form action="" method="POST">
        <div class="form-group">
            <label for="">Pseudo ou email</label>
            <input type="text" name="username" class="form-control"/>
        </div>

        <div class="form-group">
            <label for="">Mot de passe <a href="forget.php">(J'ai oublié mon mot de passe)</a></label>
            <input type="password" name="password" class="form-control"/>
        </div>

        <div class="form-group">
            <label>
                <input type="checkbox" name="remember" value="1"/> Se souvenir de moi
            </label>
        </div>

        <button type="submit" class="btn btn-primary">Se connecter</button>

    </form>

    <?php require 'inc/footer.php'; ?>`

Ah dac, alors la soluce en gros il doit etre à droite ou a gauche de chaque messages x)

Sinon le problème de Actif je pense qu'il vien du User, faudrait voir le model User et la table User :p

Faudrait aussi voir comment est placé ton user dans la $_SESSION['auth'], ça se trouve il est dans un tableau, et du coup faudra faire $_SESSION['auth'][0]->actif, ou alors il faut l'initialiser en faisant $surrent_user = new User($_SESISON['auth']) puis if ($current_user->actif)

Dan H
Auteur

Affiche le user: <h1>Bonjour <?= $_SESSION['auth']->username; ?></h1>
Affiche son status: <h1>Bonjour <?= $_SESSION['auth']->actif; ?></h1>

Donc, le 2e serait la bonne chose à tester.

Je vais revoir le code.

Dan H
Auteur

Bon enfin, j'ai résolu le problème de cette manière :

Dans cette fonction :

J'ai changé login.php par logout.php pour supprimer la session et en même temps, le cookie.
J'ai ajouté || !$_SESSION['auth']->actif).

function logged_only(){ if(session_status() == PHP_SESSION_NONE){ session_start(); } if (!isset($_SESSION['auth']) || !$_SESSION['auth']->actif) { $_SESSION['flash']['danger'] = "Vous n'avez pas le droit d'accéder à cette page"; header('Location: logout.php'); exit(); } }
Voilà. Tout ça dans le fichier inc/functions.php

Merci pour vos interventions, ça m'a servi.