Ce tutoriel, destiné aux utilisateurs avancés, va vous apprendre comment utiliser les sessions de phpBB dans un autre script PHP, et de définir des permissions "basiques" pour les utilisateurs authentifiés, à l'aides des variables utilisateurs telles que le groupe par défaut, etc.
Tout d'abord il est nécessaire de savoir où se trouve votre forum par rapport au fichier que vous voulez créer. Pour ne plus se préoccuper de cela par la suite, nous allons définir une constante pour notre script, où nous stockerons le chemin relatif à phpBB par rapport à nous. Par exemple, ici c'est dans le dossier "./phpBB3/"
<?php $phpbb_root_path = './phpBB3/';
Il va également nous falloir le chemin de nos fichiers à protéger, par rapport au forum (le chemin inverse en fait). Stockons cela dans $website_root_path
:
<?php $website_root_path = './../';
Vous devez tout d'abord créer un fichier qui sera inclus lors de l'appel de votre page à protéger, ceci pour éviter de réécrire le même code. Ce n'est pas très compliqué. Nous nous l'appelerons "header.inc.php". Voici ce qu'il faut y mettre
<?php define('IN_PHPBB', true); $phpEx = substr(strrchr(__FILE__, '.'), 1); $phpbb_root_path = './../phpBB3/'; $website_root_path = './../'; include($phpbb_root_path . 'common.php'); // Start session management $user->session_begin(); $auth->acl($user->data); $user->setup(); ?>
Les plus observateurs auront reconnu le code qu'ils ont aperçu plus haut.
Pour protéger votre page, incluez simplement le header, et testez si l'utilisateur est enregistré:
<?php include("./header.inc.php"); if (!$user->data['is_registered'] || !isset($user->data['is_registered'])) { login_box($website_root_path); exit(); } ?> Page protégé, authentification requise
Oui, mais comment définir des permissions avancées, pour les administrateurs, modérateurs, etc ?
Pour restreindre la page aux administrateurs, vous pouvez utiliser ceci:
<?php $auth->acl_get('a_')
Cette fonction retourne "vrai" si l'utilisateur est un admin, faux sinon. A partir ce ceci, on peut imaginer une page comme celle-ci:
<?php include("./header.inc.php"); if (!$auth->acl_get('a_')) { login_box($website_root_path); exit(); } ?> Cette page nécessite des droits d'admin
Et pour les modérateurs ? J'y viens, le même exemple modifié:
<?php include("./header.inc.php"); if (!$auth->acl_get('m_')) { login_box($website_root_path); //, 'Vous devez vous re-identifier pour acceder a cette page', 'Identification reussie', true, false); exit(); } ?> Cette page nécessite des droits de modo
Pour les plus observateurs encore, le code changé est tout simplement celui ci:
<?php if (!$auth->acl_get('m_'))
Attention: A partir du moment où l'utilisateur a des droits quelconque d'admin (ou de modérateur), la fonction retourne vrai, même s'il s'agit d'un admin "de seconde zone".
La solution est d'utiliser les groupes. Hélas, je n'ai la solution que pour les "Groupes par défaut", si le groupe testé n'est pas celui de l'utilisateur par défaut, l'autentification échouera. Le code est à modifier de cette façon:
<?php include("./header.inc.php"); if ($user->data['group_id']!='5' || !isset($user->data['group_id'])) { login_box($website_root_path); exit(); } header('Content-encoding: iso-8859-1'); ?> <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" /> Page protégé par groupe
Nous avons modifié ceci:
<?php if ($user->data['group_id']!='5' || !isset($user->data['group_id']))
Ici nous avons mis le groupe '5', il s'agit pour information du groupe des admins. Il faut spécifier le numéro du groupe dans la base de donnée, en affichant la table phpbb_groups vous devriez trouver facilement ce numéro.
Vous souhaitez rajouter un lien "Se Déconnecter" ? Pas de panique, il suffit de placer ce code:
<?php echo '<a href="'.$phpbb_root_path.'ucp.php?sid='.$user->data['session_id'].'&mode=logout">Déconnexion</a>'; ?>
phpBB utilise le format de caractères UTF-8 et se charge de le faire comprendre au navigateur lors de l'affichage de la page. A partir du moment où vous avez inclus des fichiers communs à phpBB, il est nécessaire que le texte de votre page soit convertit en UTF-8 pour qu'il s'affiche correctement.
Autre solution, expliquer au navigateur qu'il s'est fourvoyé, soit en ajoutant une balise META comme ceci:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
Soit en ajoutant juste après ce code
<?php if ($user->data['is_registered']==0 || !isset($user->data['is_registered'])) { login_box($website_root_path); exit(); }
les lignes suivantes:
<?php header("Content-encoding: utf-8");
Vous pouvez même faire les deux
Votre fichier ressemblera donc à ça:
<?php include("./header.inc.php"); if (!$user->data['is_registered'] || !isset($user->data['is_registered'])) { login_box($website_root_path); exit(); } header('Content-encoding: utf-8'); ?> <html><head><title>Un titre quelconque</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> </head> <body> Page protégé, authentification requise </body></html>