Page 1 sur 1
droits utilisateurs
Posté : 26 mai 2020, 18:55
par Figuedi
Bonjour (once again)
Sur mon site, j'ai des utilisateurs sans droits, des privilégiés et des grands patrons
Dans ma table utilisateurs j'ai nom, mail, mot de passe et une case privilège qui prendra différentes valeurs et qui pourra évoluer en fonction de ... je ne sais pas encore mais elle pourra évoluer.
Je créée donc 3 classes : usr, vip, adm
je dois donc : SELECT form users where privilège='adm'
et faire un fletchall dans Table_Adm()
et pareil pour les deux autres classes qui me donneront donc trois tableaux pour les classes.
et il faudra que je teste avant chaque ouverture de page si le $_SESSION[username] a le droit ou pas de rentrer dans la page.
est ce que je peux (et si oui comment) créer une variable $_SESSION[Privilege] qui me permettra facilement d'autoriser ou refuser certaines "portes". Si je ne peux pas il faut que je fasse des includes avant chaque page pour construire le tableau et vérifier les autorisations c'est ça ?
Re: droits utilisateurs
Posté : 26 mai 2020, 22:25
par Saian
Bonsoir,
Une possibilité parmi d'autres :
- une colonne roles sur la table user (un tableau de roles sérialisés)
- lors de la connexion stocker l'id de l'utilisateur dans la session
- à chaque page dans les premiers codes exécutés (après le require de connexion à la bdd), un require security qui récupère la ligne utilisateur dans la base sous forme objet à partir de l'id stockée
- sur la classe user une méthode hasRole($role) qui vérifie que le role est bien présent dans le tableau des roles de l'utilisateur
// dans la classe user
public function hasRoles($role) {
return in_array($role, unserialize($this->roles));
}
Après pour tes pages sécurisées selon un role, sous le require security, tu n'as plus qu'à faire un :
if (!$user->hasRole('adm')) {
header('HTTP/1.0 403 Forbidden');
// possibilité de faire un include d'une page html 403 personnalisée
exit();
}
Re: droits utilisateurs
Posté : 27 mai 2020, 07:25
par Figuedi
Bonjour et Merci Saian pour ta réponse.
J'ai compris la moitié de ta première phrase. stoker l'id sur google il semble signaler que l'Id de session peut changer et les points 3 et 4 complètement obscur.
Par contre cela m'a donné l'idée de faire ça :
que je met dans un fichier droits.php et que j'include dans chaque page nécessaire.
De deux choses l'une soit c'est très exactement ce que tu me conseillais de faire et donc je t'ai compris sans le savoir.
Soit ce sont tes explications qui m'ont poussé dans cette voie et je t'en remercie grandement.
Ou encore dernière possibilité (et surement la plus probable) ce que je fais fonctionne, mais n'a rien à voir avec ce que tu a tenté de m'expliquer.
Dans tous les cas un grand merci à toi.
Si tu as le temps de me dire laquelle des possibilités est juste ce serait sympa.
<?php
session_start();
if(!isset($_SESSION["username"])){
header("Location: login.php");
exit();
}
require('_connexion_pdo.php');
include ('header.php');
$query = "SELECT username FROM users where Privilège='ADM' ;";
try {
$pdo_select = $pdo->prepare($query);
$pdo_select->execute();
$NbreData = $pdo_select->rowCount(); // nombre d'enregistrements (lignes)
$rowAll = $pdo_select->fetchAll(); // tout dans le meme tableau
} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
for($i=0;$i<$NbreData;$i++){
$autorise[]= $rowAll[$i]["username"];
}
if (!in_array($_SESSION["username"],$autorise))
{
echo'interdit';
header('HTTP/1.0 403 Forbidden');
exit();
}
echo 'c bon';
Re: [RESOLU] droits utilisateurs
Posté : 27 mai 2020, 09:36
par Saian
C'est pas tout à fait ça. En fait, ça n'a pas de sens de créer un tableau avec tous les username alors qu'il n'y en a qu'un qui t'intéresse. Plus tu auras d'utilisateurs et plus ton traitement sera gourmand, même si l'en faudra quand même beaucoup pour que ça ait un réel impact.
Pour le point 1, lorsque l'utilisateur se connecte, au lieu de mémoriser (tu préfères ? ^^) le username dans la session, tu mémorise l'id (je suppose que la table utilisateur a bien une colonne id). Ainsi, quelque soit sont username ou son mail ou que sais je d'autre, tu l'identifies bien de manière unique, un id étant prévu pour être unique.
Tu as une colonne privilège à valeur unique, soit adm, vip ou usr. La petite différence est que je te proposais une colonne pouvant stocker plusieurs privileges. Cela donne plus de flexibilité au système mais ce n'est pas indispensable.
Pour ce qui est de "charger" l'utilisateur sous forme objet regarde la méthode fetchObject et son paramètre $class_name et regarde les exemples. Tu peux charger la ligne de la base de donnée dans ta propre class user, dans laquelle tu peux donc ajouter toutes les méthodes utiles pour tes codes.
https://www.php.net/manual/fr/pdostatem ... object.php
Et donc sur cette fameuse classe tu mets une méthode hasPrivilege($privilege) (a le privilège ? possède le privilège ?) qui va te retourner true ou false selon que le privilege de l'utilisateur correspond ou non au privilege fourni en paramètre de la méthode. Dans ton cas un simple == suffit. (return $privilege == $this->privilege)
// la classe user : je pars du principe que la colonne Privilège se nomme privilege parce que les majuscules en début de nom et les accents bof
class user {
public function hasPrivilege($privilege) {
return $privilege == $this->privilege;
}
}
// récupération du user à chaque page à partir de l'id avec pdo (include de connexion au préalable biensur et dans mon cas j'ai appelé la variable $pdo)
$statement = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$statement->execute([
':id' => $_SESSION['user_id']// $_SESSION['user_id'] mémorisé lors du login de l'utilisateur
]);
$user = $statement->fetchObject('user');// avec le nom de la classe user
// test du privilege
if (!$user->hasPrivilege('adm')) {
header('HTTP/1.0 403 Forbidden');
// possibilité de faire un include d'une page html 403 personnalisée
exit();
}
// ici l'utilisateur est bien un adm
Re: [RESOLU] droits utilisateurs
Posté : 27 mai 2020, 10:24
par Figuedi
Au top ! merci pour la dé-vulgarisation !!! j'ai compris !!!!
Re: droits utilisateurs
Posté : 27 mai 2020, 19:41
par Figuedi
en fait j'ai compris mais ne reussis pas a faire fonctionner le biniou
ca tourne jusqu'à la ligne
echo $_SESSION['user_id'];
le echo $user et le print_r $user n'affichent rien
l’au revoir ne s'affiche jamais donc je ne récupère pas les id.
et pourtant sur phpmyadmin je les vois et mon petit script pour rajouter des privilèges fonctionne aussi et je me sers de l'id donc il y est et il existe. juste je ne sais pas le récupérer.
<?php
session_start();
class user {
public function hasPrivilege($privilege) {
return $privilege == $this->privilege;
}
}
require('_connexion_pdo.php');
$statement = $pdo->prepare('SELECT * FROM users WHERE id = :id');
$statement->execute([':id' => $_SESSION['user_id']]);
$user = $statement->fetchObject('user');
echo $user;
echo'<pre>';
print_r($user);
echo'</pre>';
//session_start();
echo'<br><br><br><br>bonjour<br>';
echo '<br>Didier<br>'.$_SESSION['username'];
echo $_SESSION['user_id'];
echo'<aurevoir>';
/*echo $_SESSION['
Re: droits utilisateurs
Posté : 27 mai 2020, 19:46
par Figuedi
mon code pour modifier les privileges des utilisateurs qui fonctionne parfaitement.
si ça peut aider quelqu'un a m'expliquer mon erreur.
<?php
session_start();
if(!isset($_SESSION["username"])){
header("Location: login.php");
exit();
}
if ($_SESSION['username']=='adm')
include('ADM.php');
require('_connexion_pdo.php'); ?>
<html lang="FR-fr">
<head>
<title>***</title>
<meta charset='UTF-8'>
<meta name="viewport" content="width=device-width", initial-scale="1.0">
<meta name="description" content="***">
<link rel="stylesheet" href="style.css">
<link href="https://fonts.googleapis.com/css?family=Open+Sans:800&display=swap" rel="stylesheet">
<script src="https://code.jquery.com/jquery-3.4.1.min.js"></script>
<script src="didier.js"></script>
</head>
<div class="corps">
<form action="" method="POST">
<input type="text" name="id" placeholder="id" required />
<input type="text" name="Priv" placeholder="Privilège" required />
<input type="submit" name="submit" value="Modifier la table" />
</form>
<?php
$id=$_POST['id'];
$Priv=$_POST['Priv'];
if (isset($_POST['id'])){
$query = "UPDATE users SET privilege='$Priv' WHERE id=$id";
$pdo_select = $pdo->prepare($query);
$pdo_select->execute();
}
$query = "SELECT * FROM users ;";
try {
$pdo_select = $pdo->prepare($query);
$pdo_select->execute();
$NbreData = $pdo_select->rowCount();
$rowAll = $pdo_select->fetchAll();
} catch (PDOException $e){ echo 'Erreur SQL : '. $e->getMessage().'<br/>'; die(); }
$nbcol=2;
echo '<table >';
for($i=0;$i<$NbreData;$i++){
$valeur1=$rowAll[$i]['id'];
$valeur2=$rowAll[$i]['nom'];
$valeur3=$rowAll[$i]['email'];
$valeur4=$rowAll[$i]['privilege'];
if($i%$nbcol==3)
echo '<tr>';
echo '<td>'.$valeur1.'</td><td>'.$valeur2.'</td><td>'.$valeur3.'</td><td>'.$valeur4.'</td>';
if($i%$nbcol==($nbcol-1))
echo '</tr>';
}
echo '</table>';
?>
</div>
Re: droits utilisateurs
Posté : 27 mai 2020, 19:56
par Saian
Je viens de tester le code pour être sûr et ça fonctionne. Alors tu dois avoir un petit problème, genre la requête qui déconne ou ne retourne rien, le user_id en session qui serait vide ou encore autre chose ?
Re: droits utilisateurs
Posté : 27 mai 2020, 20:10
par Figuedi
le user_id en session est vide oui mais je pensais que justement je le remplissais grace à l'id dans la table users
Re: droits utilisateurs
Posté : 27 mai 2020, 20:22
par Saian
Comme je l'ai précisé il faut le définir lors du login, de la même manière que tu définis le username. C'était le point n°2 et je l'ai également indiqué dans l'exemple de code en commentaire.
Re: droits utilisateurs
Posté : 27 mai 2020, 22:06
par Figuedi
OK OK j'avais donc bien rien compris.
Merci beaucoup, ça marche nickel
Re: droits utilisateurs
Posté : 27 mai 2020, 22:30
par Figuedi
Donc ça marche c'est nickel, tu as laissé entendre qu'il me serait possible (et ça m’intéresse fortement) de donner des doubles privilèges.
Un ADM devrait avoir les privilèges VIP, mais peut etre que certaines zone VIP ne devraient pas être accessible aux ADM
en clair dans la colonne privilège de la table me serait il possible d'avoir (VIP, ADM) pour accéder aux deux pages ou que VIP, ADM, USR ou toutes autres combinaisons possible et imaginable ?
Re: droits utilisateurs
Posté : 27 mai 2020, 23:37
par Saian
C'est possible oui. Il n'y a pas qu'une façon de le faire mais tu peux par exemple attribuer un tableau de privilèges à l'utilisateur.
Pour stocker l'information dans la base de données tu peux sérialiser le tableau. Ca transforme le tableau sous forme de chaine de caractères que tu peux stocker dans une colonne de type text.
// exemple d'insert (je mets pas toutes les colonnes mais tu vois l'idée)
$statement = $pdo->prepare('INSERT INTO users SET privileges = :privileges');
$statement->execute([
'privileges' => serialize([ 'adm', 'vip' ])
]);
Lorsque tu récupères la ligne, tu peux alors désérialiser cette chaine pour récupérer le tableau.
class user {
public function __construct() {
$this->privileges = unserialize($this->privileges);
}
public function hasPrivilege($privilege) {
return in_array($privilege, $this->privileges);
}
}
Tu pourrais ensuite ajouter des méthodes de tests pour les différents tests (possède ce privilège, possède un de ces privilèges, possède tous ces privilèges).
class user {
// ...
public function hasOnePrivilegeIn($privileges) {
return count(array_intersect($privileges, $this->privileges));
}
public function hasAllPrivilegesIn($privileges) {
return count($privileges) == count(array_intersect($privileges, $this->privileges));
}
}
Tu pourrais aussi imaginer une hiérarchie de privilèges. adm possède les droits vip et usr, vip possède les droits usr et usr possède seulement les droits usr, mais je vais m'arrêter la.
Re: droits utilisateurs
Posté : 28 mai 2020, 08:01
par Figuedi
Merci beaucoup