Aller au menu - Aller au contenu

Icône Autorisations d'accès

Avatar
Mise à jour : 30/11/2010
Difficulté : Facile Facile Creative Commons BY
4 418 visites depuis 7 jours , dont 145 sur ce chapitre , classé 40/777
On arrive à la partie la plus délicate de la création d'un forum, les pages d'administration. C'est-à-dire au final la façade qui fait la transition entre vous et votre base de données.

Dans ce chapitre (très court :) ), nous allons voir comment régler les autorisations d'accès.
Mais qu'est-ce donc qu'une autorisation d'accès o_O ? Bah, comme son nom l'indique, c'est simplement un moyen de vérifier si un membre a le droit d'être là où il est. En fait, on en a déjà mis un peu partout pour éviter qu'un membre non connecté poste un message, par exemple.
On va élargir un peu ce concept avec les modérateurs et administrateurs, grâce à un système assez simple.

Au programme :
  • Création d'un forum réservé au modo
  • Gestion du bannissement
  • Donner la permission aux modérateurs (et seulement aux modérateurs) de poster des annonces

On y va :) .
Sommaire du chapitre :
Icône du chapitre
Chapitre précédent Sommaire Chapitre suivant

Faire un forum VIP

Vous avez sûrement remarqué que, sur la plupart des forums, il existe des sessions réservés aux modérateurs et administrateurs, pour qu'ils puissent décider en paix des supplices qu'ils vont nous faire subir :D . Vous vous dites peut-être que vous n'en voyez pas l'intérêt, et pourtant il est énorme : lorsque votre forum commence à prendre un peu d'importance, il est très utile de pouvoir communiquer avec le reste de l'équipe.

Si vous avez suivi le déroulement du tuto jusqu'ici, vous pouvez remarquer qu'en fait tout est déjà mis en place.

Petit retour en arrière



Si je vous parle des cinq colonnes qu'on n'a pas encore utilisés dans la table forum_forum, vous me dites auth_view, auth_post, auth_topic, auth_annonce, et auth_modo, bien sûr :D . Je vous avais rapidement expliqué qu'ils permettaient de désigner quel groupe de membres a le droit de lire un forum, d'y poster un message ou un topic.

Vous vous souvenez aussi de la variable $lvl, qui permet de connaître le niveau d'un visiteur (modérateur, administrateur ou membre).

Je pense que vous avez compris qu'en cumulant les deux, on peut faire des miracles. ^^

Par exemple, si je veux qu'un forum puisse n'être vu que par les membres, mais que seuls les modérateurs puissent y poster un topic, et que seuls les administrateurs puissent y laisser un post (ne cherchez pas la logique :D ) il suffit de mettre les valeurs suivantes :

ChampValeurAlias
auth_view 2 INSCRIT
auth_topic 3 MODO
auth_post 4 ADMIN


Et puis le tour est joué !

Le problème



Il y a un problème (je vous dois bien ça :-° ) : comment faire pour créer un forum visible par les modérateurs et les administrateurs?

Eh bien en fait c'est la raison pour laquelle les champs auth_bidule sont des entiers ; ce que l'on va faire, c'est attribuer un numéro pour chaque catégorie de membres (par exemple, 4 pour les admins), de façon à les classer par ordre d'importance. Ensuite, il suffit de vérifier si le niveau d'accès est supérieur au niveau nécessaire :) .

La solution !



Pour vous montrer comment faire à l'avenir, je vais utiliser un petit exemple. Nous allons créer un forum de news, c'est-à-dire que :

  • tous les visiteurs pourront le lire
  • seuls les membres pourront y poster un message
  • seuls les modérateurs pourront y poster un topic
  • seuls les administrateurs pourront le modérer.


Sachant que quand je dis "seuls les membres", il ne faut pas penser que les modérateurs n'auront pas le droit de poster un message, il s'agit de l'exigence minimale.


Vous vous souvenez de la page constants.php ? Je vous avais dit d'y écrire les 4 lignes suivantes :

Code : PHP
1
2
3
4
5
6
<?php
define('VISITEUR',1);
define('INSCRIT',2);
define('MODO',3);
define('ADMIN',4);
?>


Et bien on a donc les correspondances qui suivent :

NiveauAutorisation
Visiteur
1
Inscrit
2
Modérateur
3
Administrateur
4


Ensuite, il va falloir modifier plusieurs choses.

La base de données



La gestion des autorisations de chaque forum se fera à l'avenir via le panneau d'administration, mais en attendant, vous devez le faire manuellement. Nous allons donc modifier les champs de notre forum News.

Code : SQL
1
2
3
UPDATE forum_forum 
SET auth_view = 1, auth_post = 2, auth_topic = 2, auth_annonce = 3, auth_modo = 4 
WHERE forum_id = 2


Et si vous avez supprimé le forum depuis tout ce temps :

Code : SQL
1
2
INSERT INTO forum_forum ( forum_cat_id , forum_name , forum_desc , forum_ordre , forum_last_post_id , forum_topic , forum_post , auth_view , auth_post , auth_topic , auth_annonce, auth_modo )
VALUES ( 1, 'Les News', 'Les news du site sont ici', 50, 0, 0, 0, 1, 2, 2, 3, 4 )


Maintenant que les champs sont remplis, le plus dur est fait ; ensuite, il n'y a plus qu'à mettre des conditions un peu partout pour vérifier les droits.

Une fonction ?



Quand j'ai dit mettre des conditions un peu partout, ça a du évidemment alerter votre logique de codeur php :-° . En effet, on va pouvoir simplifier tout ça avec une fonction, celle-ci prend un paramètre : le niveau nécessaire que doit avoir un membre. Puis elle nous dira si l'utilisateur peut continuer.

Code : PHP
1
2
3
4
5
6
7
<?php
function verif_auth($auth_necessaire)
{
$level=(isset($_SESSION['level']))?$_SESSION['level']:1;
return ($auth_necessaire <= intval($level));
}
?>


Pour l'utilisation, c'est super simple puisqu'il suffit de faire ceci :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
if(verif_auth(INSCRIT))
{
//Afficher le forum
}
else
{
//Laisser tomber :p
}
?>


Pensez bien à l'inclure sur toutes vos pages ! Le mieux est d'utiliser la page functions.php pour cela.


Page d'index



Pour la page d'index, on pourrait utiliser la fonction, néanmoins ce n'est qu'une sécurité superflue puisque la requête va déjà chercher les forums qui satisfont les autorisations d'accès. Pour l'exemple on va quand même regarder ce que ça donne.

Si vous vous souvenez bien, il y a une grosse requête qui est suivie par ceci :

Page : index.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
//Début de la boucle
        while($data=$query->fetch())
        {
        //On affiche chaque catégorie
        if( $categorie != $data['cat_id'] )
        {
        //Si c'est une nouvelle catégorie on l'affiche
       
                $categorie = $data['cat_id'];
                ?>
                <tr>
                <th></th>
                <th class="titre"><strong><?php echo $data['cat_nom']; ?>
                </strong></th>             
                <th class="nombremessages"><strong>Sujets</strong></th>       
                <th class="nombresujets"><strong>Messages</strong></th>       
                <th class="derniermessage"><strong>Dernier message</strong></th>   
                </tr>
                <?php
               
         }


Et juste après, un echo s'occupe d'afficher le contenu de chaque catégorie, c'est-à-dire chaque forum. C'est ici qu'on va agir :ninja: !
Ajoutez simplement après :

Code : PHP
1
2
3
4
5
<?php
if (verif_auth($data['auth_view']))
{
//Affichage des forums
?>


Vous comprenez à présent pourquoi la requête du début de page allait chercher le champ auth_view ; par ailleurs, vous voyez que la fonction est vraiment simple à utiliser. On fait un if, on affiche les forums, puis on ferme le if. Ainsi, les forums qui apparaissent sont ceux que le membre a le droit de voir ; dans l'exemple du forum de news, tout le monde verra le forum.
Ensuite, on affiche les forums, puis on termine ici :

Code : PHP
1
2
3
4
5
6
7
<?php
else
{
echo'<td class="nombremessages">Pas de message</td></tr>';
}
} //Fin de la vérification d'autorisation
?>


A présent, le forum ne s'affiche plus si vous n'êtes pas autorisés à le voir ; en revanche, il est toujours possible de le modifier en se rendant directement sur la page voirforum.php. On va voir comment arranger ça.

Attention à ne pas inverser le signe > en < : ça peut paraître idiot de dire ça, mais c'est une erreur fréquente, surtout lorsqu'on va un peu vite. Donc, si vous avez un résultat inattendu, il est probable que ça vienne d'ici.


Page voirforum



Maintenant que le forum s'affiche seulement pour les personnes autorisées, on va pouvoir passer à la page voirforum.php, rien de bien compliqué sur cette page puisqu'il s'agit simplement de vérifier que le visiteur ne s'est pas introduit ici en modifiant l'url. Ensuite, on va regarder si celui-ci a le droit de poster un nouveau topic. Si c'est le cas, on affiche le bouton-lien qui permet de se rendre à la page poster.php.

Pour commencer, rendez-vous en haut de la page voirforum.php, à l'endroit où vous voyez une requête dans ce style :

Page : voirforum.php

Code : PHP
1
2
3
4
5
6
7
8
<?php
//A partir d'ici, on va compter le nombre de messages 
//pour n'afficher que les 25 premiers
$query=$db->prepare('SELECT forum_name, forum_topic, auth_view, auth_topic FROM forum_forum WHERE forum_id = :forum');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
?>


Juste en dessous, nous allons utiliser la fonction pour vérifier les droits du membres : s'il y a un problème on utilise la fonction erreur avant d'afficher quoi que ce soit. A vous d'aller faire les bonnes modifications dans la page constants.php, je vais pas tout faire non plus (nan mais ! :colere2: )

Code : PHP
1
2
3
4
5
6
<?php
if (!verif_auth($data['auth_view']))
{
erreur(ERR_AUTH_VIEW);
}
?>


A présent, voyons le deuxième aspect qui est celui du bouton "nouveau topic". Recherchez un peu plus bas l'endroit où vous avez placé l'image :

Code : PHP
1
2
3
4
5
<?php
//Et le bouton pour poster
echo'<a href="./poster.php?action=nouveautopic&amp;f='.$forum.'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic" /></a>';
?>


Il faut cette fois vérifier l'autorisation en rapport avec le droit de créer un nouveau sujet, c'est donc le champ auth_topic qui va être utilisé :

Code : PHP
1
2
3
4
5
6
7
8
<?php
if (verif_auth($data['auth_topic']))
{
//Et le bouton pour poster
echo'<a href="./poster.php?action=nouveautopic&amp;f='.$forum.'">
<img src="./images/nouveau.gif" alt="Nouveau topic" title="Poster un nouveau topic"></a>';
}
?>


L'idéal serait de placer une image alternative avec un else pour que le membre ne soit pas complètement perdu en ne voyant plus son image :p . Ou bien vous pouvez afficher un petit texte, pour lui expliquer qu'il n'a pas les droits.

Pour reprendre l'exemple du forum de news, un visiteur non connecté ou un simple membre ne pourrait pas voir ce bouton.

Vous voyez qu'en fait si on utilise la fonction, il ne s'agit que de légères modifications à faire ici et là ; cependant il ne faut pas non plus en oublier, sinon il suffira de connaître un peu le nom des pages pour pouvoir aller où l'on veut.

Page voirtopic.php



Dans la page voirtopic.php, il faut vérifier encore une fois une série d'autorisations.
Tout d'abord, s'assurer que le membre a bien l'autorisation de voir le forum auquel appartient le sujet en question.
Puis, s'assurer qu'il a le droit de poster un nouveau topic (auquel cas on affiche l'image en question).
Et enfin s'assurer qu'il a le droit de poster une réponse.

Heureusement pour nous, le terrain est déjà préparé puisque vous devriez avoir une requête qui s'approche de ça :

Page : voirtopic.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
$query=$db->prepare('SELECT topic_titre, topic_post, forum_topic.forum_id, topic_last_post,
forum_name, auth_view, auth_topic, auth_post 
FROM forum_topic 
LEFT JOIN forum_forum ON forum_topic.forum_id = forum_forum.forum_id 
WHERE topic_id = :topic');
$query->bindValue(':topic',$topic,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
?>


Une fois encore, on ajoute sans plus attendre la première vérification :

Code : PHP
1
2
3
4
5
6
<?php
if (!verif_auth($data['auth_view']))
{
    erreur(ERR_AUTH_VIEW);
}
?>


Enfin, on se dirige vers les boutons 'poster' et 'répondre', qu'on entoure des conditions suivantes :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
if (verif_auth($data['auth_post']))
{
//On affiche l'image répondre
echo'<a href="./poster.php?action=repondre&amp;t='.$topic.'">
<img src="./images/repondre.gif" alt="Répondre" title="Répondre à ce topic"></a>';
}

if (verif_auth($data['auth_topic']))
{
//On affiche l'image nouveau topic
echo'<a href="./poster.php?action=nouveautopic&amp;f='.$data['forum_id'].'">
<img src="./images/nouveau.gif" alt="Nouveau topic" 
title="Poster un nouveau topic"></a>';
}
?>


Ce n'est pas plus compliqué que ça :) . D'ailleurs on touche à la fin, il ne nous reste plus qu'à modifier une page.

Page poster.php



Comme ce qu'on fait depuis tout à l'heure est assez répétitif, et surtout assez facile, je vais vous laisser vous occuper seuls de cette page, parce qu'il est important que vous ayez compris le fonctionnement de ce système afin de pouvoir le personnaliser au maximum.

Voilà ce qu'il faut vérifier :

  • déjà, que le visiteur a le droit d'être sur le forum (auth_view)
  • ensuite, qu'il a le droit de poster un nouveau sujet (pour cela, il faut travailler à l'intérieur du switch après le case"nouveautopic":)
  • enfin, de la même façon qu'il peut répondre (case"repondre":)


Encore une fois, tout est déjà mis en place grâce à une requête, celle-ci diffère selon qu'on se trouve dans le cas d'un nouveau topic ou d'une réponse.

Pensez à placer les vérifications avant d'afficher le contenu de la page : si elle n'est pas remplie, faîtes un simple erreur, puis passez à la suite.

Pour ce qui est de la page postok.php, on ne peut logiquement pas s'y rendre en postant quelque chose, dans la mesure où l'accès à la page poster.php est bloqué si on n'a pas les droits. Toutefois, ça ne coûte rien de le faire quand même : faites donc exactement les mêmes modifications là-bas.

Nous avons maintenant terminé ce système d'autorisations ; dans tous les forums, vous pouvez régler différents niveaux d'accès. Libre à vous de faire une partie réservée aux modérateurs ou aux administrateurs.

Le bannissement

Il arrive malheureusement souvent d'être confronté à des membres qui ne respectent pas les règles de votre forum, et qu'il faut donc supprimer.
Vous pouvez bien sûr l'effacer carrément de la base de données, mais s'il a déjà posté des messages, ça risque de créer des bugs. Reste donc une solution, le bannissement. Via le panneau d'administration, il est possible de choisir un membre et de le bannir, c'est-à-dire que si celui-ci essaye de se reconnecter, il sera bloqué.

La technique la plus simple est de lui mettre un niveau d'autorisation à 0. Comme ça, il ne pourra se rendre sur aucune page (je rappelle que 1 est pour un visiteur non connecté).

Cependant ça ne suffit pas : il faut faire comprendre à ce membre qu'il n'est plus le bienvenu. C'est-à-dire que sur la page de connexion, s'il entre bien ses identifiants, un message apparait et lui explique tout ^^ .
Prenez la page connexionok.php, je vous rappelle rapidement son fonctionnement :
on récupère ce qui est entré dans le formulaire, on vérifie que le pseudo et le mot de passe concordent, puis on attribue les variables de sessions.
On va simplement vérifier que la valeur du champ membre_rang est nulle ; si c'est le cas, c'est que le membre est banni, et on ne déclare pas les variables de session. Ainsi, il ne sera pas connecté.
Voyez plutôt :

Page : connexion.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
<?php
if ($data['membre_mdp'] == md5($_POST['password'])) // Acces OK !
{
    if ($data['membre_rang'] == 0) //Le membre est banni
    {
        $message="<p>Vous avez été banni, impossible de vous connecter sur ce forum</p>";
    }
    else //Sinon c'est ok, on se connecte
    {
        $_SESSION['pseudo'] = $data['membre_pseudo'];
        $_SESSION['level'] = $data['membre_rang'];
	$_SESSION['id'] = $data['membre_id'];

       
        $message = '<p>Bienvenue '.$_SESSION['pseudo'].', vous êtes maintenant connecté !</p> <br />
        <p>Cliquez <a href="./index.php">ici</a> pour revenir à la page d accueil</p>';
    }
}
?>


Vous devez normalement reconnaitre ce morceau de code : ce que j'ai fait, c'est ajouter une condition comme je l'ai expliqué plus haut.

Attention toutefois, le membre est banni et ne peut donc pas se connecter : ce n'est pas pour ça qu'il lui est impossible de visiter le forum en tant que visiteur "simple", on parle d'ailleurs souvent de lecture seule pour dire bannissement.

Mais en fait, qu'est-ce qui l'empêche de recréer un compte ?


Rien... si ce n'est son adresse e-mail. A vrai dire, il est difficile de vraiment empêcher un membre de revenir : tout ce que vous pouvez espérer, c'est qu'il se rachètera ^^ .
Cependant, il existe une méthode qui vaut ce qu'elle vaut : faire une table reliant les id des membres bannis et leurs adresses IP. Ainsi, vous pouvez faire une vérification sur l'adresse IP au moment de la connexion, et surtout de l'enregistrement. Mais en aucun cas cela ne va l'empêcher de revenir, il lui suffira de changer son adresse IP. C'est simplement une vérification de plus.

Voilà, nous venons de voir un statut assez spécial qui est celui d'un membre déchu :p . Si je dis statut, c'est parce qu'il s'agit en fait, comme vous l'avez vu, du niveau d'autorisation le plus bas possible.

Avant de conclure ce chapitre, j'aimerais que nous voyions rapidement comment permettre aux modos et aux admins de poster des annonces.

Les annonces

Cette partie est très courte, je vous rassure : il faut simplement placer une petite vérification sur le formulaire de la page poster.php, et une autre sur postok.php.
Pour éviter une trop grande prolifération des annonces, seuls les modérateurs (ou les administrateurs, de toute façon, eux, ils peuvent tout faire :p ) pourront en poster. Nous allons donc reprendre la fin du formulaire de la partie du switch concernant les nouveaux topics, et la modifier comme ceci :

Page : poster.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<textarea cols=80 rows=8 id="message" name="message"></textarea>
<br />
<?php
if (verif_auth($data['auth_annonce']))
{
    ?>
    <label><input type="radio" name="mess" value="Annonce" />Annonce</label>
    <label><input type="radio" name="mess" value="Message" checked="checked" />Topic</label><br />
    <?php
}
?>
<input type="submit" name="submit" value="Envoyer" />
<input type="reset" name ="Effacer" value ="Effacer" />
</form></p>


Ainsi, un membre normal ne voit pas qu'il y a le choix, il ne peut que poster un topic "normal". La variable de $_POST['mess'] est donc nulle (je vous rappelle que, dans la base de données, sa valeur par défaut est celle d'un topic normal, c'est pourquoi il n'est pas nécessaire de préciser davantage).
En revanche, un modérateur a le choix, lui. Enfin je m'arrête là, je pense que vous avez compris l'idée.

Vous remarquez toutefois qu'il y a une séparation entre les champs auth_annonce et auth_modo, c'est-à-dire que si vous voulez, vous pouvez permettre à n'importe quelle catégorie de membres de poster une annonce sur un forum précis.

Il faut à présent se rendre sur la page postok.php : en effet, même si la valeur de $_POST['mess'] ne peut être remplie que par les personnes autorisées, il n'est pas exclu qu'un membre arrive à contourner le problème en utilisant un formulaire qui utilise postok.php comme page de traitement. Il pourrait alors poster une annonce. Pour éviter ça, on va simplement placer une vérification dans la partie nouveautopic de la page postok.
Vous pouvez par exemple faire comme ceci :

Code : PHP
1
2
3
4
5
6
<?php
if (!verif_auth($data['auth_annonce']) && isset($_POST['mess']))
{
    exit('</div></body></html>');
}
?>


Et voilà le travail. :p

Remarques

Juste quelques mots avant que je vous lâche : ce chapitre a été simplifié au maximum mais il n'est pas parfait ; je vais vous donner quelques idées pour améliorer et personnaliser ce système.

Si vous avez bien regardé, il est impossible d'attribuer des modérateurs différents sur chaque forum (comme sur phpbb), c'est-à-dire que les modérateurs ont des droits spéciaux sur tous les forums.

Ce que vous pouvez faire, c'est créer des groupes, qui ont des privilèges différents (par exemple, le groupe des newsers qui ont la possibilité de modérer le forum news, mais qui restent des membres "normaux" partout ailleurs).
Pour cela, il vous faut plusieurs tables supplémentaires :

- une table forum_groupes du style
group_id, group_name, group_logo, etc.
- une table forum_groupes_droits du style
group_id, forum_id, group_droit.

Du coup, si on reprend l'exemple des newsers (oui, j'y tiens ^^ ), on aurait :

Citation : Pas de titre

Table forum_groupes : 5, Newsers, newser.jpg
Table forum_groupes_droits : 5, 1, 3

Je rappelle que 3 équivaut au niveau de modération.
5 est l'id du groupes : Newsers et 1 est l'id du forum de news.

Il ne faudra alors plus se baser sur la variable $lvl pour connaître le niveau d'autorisation d'un membre, mais sur le résultat d'une requête qui pourrait ressembler à ça :
Code : SQL
1
2
3
4
SELECT group_droit FROM forum_membres
LEFT JOIN forum_groupes_droits
ON forum_groupes_droits.group_id = forum_membres.membre_rang
WHERE membre_id = :id');



Ainsi, vous avez complexifié un peu le système d'autorisation de votre forum.
L'avantage énorme qu'on en tire est qu'on n'est plus limités dans le nombre de groupes. On peut très bien atteindre le groupe avec l'id 39 !

Oui, mais du coup les newsers (puisqu'ils ont l'id 5 dans ton exemple) seront plus importants que les admins !


C'est vrai si l'on continue à garder l'ancienne méthode (enfin, pas si ancienne quand même :p ) en utilisant la fonction verif_auth. Mais il faut sortir de ce concept, l'id d'un groupe ne sert à présent qu'à l'identifier, et la table forum_groupes_droits nous informe sur son niveau d'accès sur le forum en question.


Afficher les droits du membre !



Une dernière remarque, il peut être utile pour plus de clarté d'afficher sur un pied de page les droits du membre sur le forum/topic où il se trouve.
En plus de ça, vous allez voir dans le prochain chapitre que vous allez pouvoir mettre en place une véritable boîte de modération qu'il peut être utile de placer ici.

Voici par exemple à quoi pourrait ressembler ce footer sur la page voirtopic.php

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<div id="footer">
<?php
echo '<h2>Options de modération</h2>';

$query=$db->prepare('SELECT auth_view, auth_modo, auth_post FROM forum_forum WHERE forum_id=:forum');
$query->bindValue(':forum',$forum,PDO::PARAM_INT);
$query->execute();
$data=$query->fetch();
$view = (verif_auth($data['auth_view']))? 'Vous pouvez <b>voir</b> ce topic':'Vous <i>ne</i> pouvez <i>pas</i> <b>voir</b> ce topic';
$post = (verif_auth($data['auth_post']))? 'Vous pouvez <b>répondre</b> à ce topic':'Vous <i>ne</i> pouvez <i>pas</i> <b>répondre</b> à ce topic';
$modo = (verif_auth($data['auth_modo']))? 'Vous pouvez <b>modérer</b> ce topic':'Vous <i>ne</i> pouvez <i>pas</i> <b>modérer</b> ce topic';
echo '<p>'.$view.'<br />'.$post.'<br />'.$modo.'</p>';
$query->CloseCursor();
?>
</div>
Voilà pour cette histoire d'autorisations. On a ainsi commencé tranquillement dans les pages d'administration, puisque vous voyez qu'il ne s'agit que de petites modifications.

A l'avenir, lorsque vous voudrez créer un forum, il faudra renseigner la valeur des champs auth_view, auth_post, etc. pour une plus grande liberté.

La suite du tuto est un TP : elle concerne la partie modération, suppression de topics ou édition. Dès que vous être partants, on y va !
Chapitre précédent Sommaire Chapitre suivant

Partager

38 commentaires pour "Autorisations d'accès"
Note moyenne : 3.66 / 4 (334 votes)
Pseudo Commentaire
Hors ligne didous # Posté le 24/09/2010 à 19:41:42
Avatar

pour ceux qui galèrent sur la page posterok (pour les autorisations) voici ce que j'ai fait (et ça à l'air de fonctionner...)
J'effectue une requête pour récupérer les auth du forum en question. Ensuite pour chaque "case" de notre boucle j'effectue le "test autorisation" dès que ma variable $forum est définie (en fait dès que je l'id du forum).Ce qui donne:
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
<?php case "nouveautopic":
		
		
		//On passe le message dans une série de fonction
		$message = mysql_real_escape_string($_POST['message']);
		$mess = mysql_real_escape_string($_POST['mess']);

		//Pareil pour le titre
		$titre = mysql_real_escape_string($_POST['titre']);

		//ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable f
		$forum = (int) $_GET['f'];
		$temps = time();
		//la requete pour récupérer les droits associés à ce forum les droits 
		$requete1 = mysql_query('SELECT auth_view, auth_post, auth_topic, auth_modo FROM forum_forum
		WHERE forum_id="'.$forum.'"');
		$data1=mysql_fetch_assoc($requete1);
		
		if ((!verif_auth($data1['auth_annonce']) and isset($_POST['mess']))or !verif_auth($data1['auth_topic'])or!verif_auth($data1['auth_view']))
		{
			exit('acess denied </div></body></html>');
		}
		
		if (empty($message) || empty($titre))
		{
			echo'<p>Votre message ou votre titre est vide, cliquez <a href="./poster.php?action=nouveautopic&amp;f='.$forum.'">ici</a> pour recommencer</p>';
		}
		else //Si jamais le message n'est pas vide
		{
?>


Puis pour case:repondre, même principe, sauf qu'il faut faire la requête juste après la création de $forum (donc après la $requête2)
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
case "repondre":
		
		//On passe le message dans une série de fonction
		$message = mysql_real_escape_string($_POST['message']);


		//ici seulement, maintenant qu'on est sur qu'elle existe, on récupère la valeur de la variable t
		$topic = (int) $_GET['t'];
		$temps = time();
			

		if (empty($message))
		{
			echo'<p>Votre message est vide, cliquez <a href="./poster.php?action=repondre&amp;t='.$topic.'">ici</a> pour recommencer</p>';
		}
		else //Sinon, si le message n'est pas vide
		{

			//On récupère l'id du forum
			$requete2 = mysql_query('SELECT forum_id, topic_post
			FROM forum_topic
			WHERE topic_id = "'.$topic.'"');

			$data2= mysql_fetch_assoc($requete2) or die ("Une erreur semble être survenue lors de l'envoi du message");
			$forum = $data2['forum_id'];
			
			//verification des droits
			$requete1 = mysql_query('SELECT auth_view, auth_post, auth_topic, auth_modo FROM forum_forum
			WHERE forum_id="'.$forum.'"');
			$data1=mysql_fetch_assoc($requete1);
			if (!verif_auth($data1['auth_post'])or!verif_auth($data1['auth_view']))
			{
				exit('acess denied </div></body></html>');
			}

			//Puis on entre le message
                        mysql_query("INSERT INTO forum_post
			(post_id, post_createur, post_texte, post_time, topic_id, post_forum_id)
			VALUES(',' ,'".intval($_SESSION['id'])."', '".$message."', '".$temps."', '".$topic."', '".$forum."')")
			or die ("Une erreur semble avoir survenu lors de l'envoi du message");
?>


Voilà, étant débutant en programmation il se peut que ce soit faux, en tout cas on dirait que ça marche.
N'hésitez pas à me faire part de vos commentaires! :p
Hors ligne bikinos # Posté le 09/10/2010 à 16:46:56

Bonjour,

Ce tuto est exelent (19/20)

Mais je bloque sur cette partie: je comprends rien pour la partie 1 (interdire l'acces a certaines personne pour la partie news)
Merci de me répondre ...

Image utilisateur
 
Hors ligne -SkYnet- # Posté le 25/10/2010 à 14:58:32
Avatar

on peut se passer de auth_view d'après moi suffit de choper le rang du membre
exemple avec la page poster :
Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
<?php 
        
        
        $compare_session = mysql_query('SELECT membre_rang FROM forum_membres  WHERE membre_id = "'.$_SESSION['id'].'"');
        $session_compare = mysql_fetch_array($compare_session);
        
        
        
        ?>
        <?php
        if ($session_compare['membre_rang'] > 2)
        {
        ?>

        
        <label><input type="radio" name="mess" value="Annonce" />Annonce</label>
        <label><input type="radio" name="mess" value="Message" checked="checked" />Topic</label>
        
        <?php
        
        }
        
        ?>


pour moi les membres sont grade 2 donc si la personne a un grade plus élevé que membre il voit ces boutons

si vous n'avez pas compris la requete ce qui m'étonne : elle demande à mysql de choper le rang du membre dont l'id est celle de sa session

ex: l'id de ma session est 52 dans la table l'id numero 52 correspondra à vous et elle prendra votre rang

"Nous finissons tous par mourir, notre but n'est pas d'être immortel, notre but est de créer quelque chose qui nous survivra." Chuck Palahniuk
 
Hors ligne nico2aa # Posté le 11/09/2011 à 19:41:08
Avatar

Avis : Très bon

Ville : Ajaccio
Pays : France métropolitaine

Salut a tous,
Citation : tutoriel
Page poster.php


Comme ce qu'on fait depuis tout à l'heure est assez répétitif, et surtout assez facile, je vais vous laisser vous occuper seuls de cette page, parce qu'il est important que vous ayez compris le fonctionnement de ce système afin de pouvoir le personnaliser au maximum.

Voilà ce qu'il faut vérifier :

déjà, que le visiteur a le droit d'être sur le forum (auth_view)
ensuite, qu'il a le droit de poster un nouveau sujet (pour cela, il faut travailler à l'intérieur du switch après le case"nouveautopic":)
enfin, de la même façon qu'il peut répondre (case"repondre":)



Encore une fois, tout est déjà mis en place grâce à une requête, celle-ci diffère selon qu'on se trouve dans le cas d'un nouveau topic ou d'une réponse.

Pensez à placer les vérifications avant d'afficher le contenu de la page : si elle n'est pas remplie, faîtes un simple erreur, puis passez à la suite.

Pour ce qui est de la page postok.php, on ne peut logiquement pas s'y rendre en postant quelque chose, dans la mesure où l'accès à la page poster.php est bloqué si on n'a pas les droits. Toutefois, ça ne coûte rien de le faire quand même : faites donc exactement les mêmes modifications là-bas.

Nous avons maintenant terminé ce système d'autorisations ; dans tous les forums, vous pouvez régler différents niveaux d'accès. Libre à vous de faire une partie réservée aux modérateurs ou aux administrateurs.


Je suis bloqué ici pour la page postok.php, car dans la page poster.php nous avont les variable t, f ou p qui nous renseigne sur verif_auth ect.. car y'a une requête mais dans postok.php il n'y a pas de requête alors comment faire ? créer un requête a chaque case "repondre", "nouveautopic" ? car data ben il sert a rien sinon dans postok.php sans une requête
Merci

Secret (cliquez pour afficher)
o_O Pourquoi ta cliqué :pirate:

 
Hors ligne Doudou45 # Posté le 11/10/2011 à 19:07:23
Avatar

Mon problème est résolu désolé ^^

Voir tous les commentaires