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
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');
}
}
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.
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.
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)
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.
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.