Phpbb3_Auth

[ phpBB - phpBB3 ]

Utiliser l'authentification de phpBB

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.

Où sont mes fichiers ?

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 = './../';

Le fichier d'en-tête

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.

La page à protéger

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

Les droits des utilisateurs

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.

Et le logout dans tout ça ?

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>';
   ?>

Problèmes potentiels

Tous mes accents sont remplacés par des '?'

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>
Creative Commons License