Интеграция пользователей сайта и форума на phpbb 3

в 19:32, , рубрики: php, phpbb, phpbb3, пользователи, метки: , ,

Совсем недавно возникла необходимость быстрой интеграции сайта и форума phpbb3. Погуглив, нормального примера не нашел. Пришлось писать самому. Возможно, кому-то пригодится.

Итак, пусть есть сайт, с собственной системой авторизации. Необходимо добавить форум phpbb с быстрым (и возможно даже правильным) решением проблем с интеграцией существующей пользовательской базы. Авторизация и регистрация новых пользователей по-прежнему будет происходить на сайте, в форум будут попадать уже зарегистрированные пользователи. Регистрация и авторизация на форуме будет закрыта.

Для начала отключим возможность регистрации новых пользователей:
Для этого в администраторском аккаунте перейдите на вкладку “Общие”, и в левом меню выберите “Регистрация пользователей”. Далее отключаем регистрацию:

image

Итак, начнем писать наш плагин:

Все плагины авторизации хранятся в поддиректории форума includes/auth/. Там уже есть несколько файлов-плагинов помимо стандартного auth_db. Добавляем свой плагин: пусть он будет называться auth_simple. Важно, что название файла будет определять названия содержащихся функций. Создаем файл includes/auth/auth_simple.php.

Как минимум, наш файл должен иметь функцию

login_simple(&$username, &$password)

Функция должна возвращать массив такого содержания:

array(
               'status'     => LOGIN_SUCCESS, // все понятно
               'error_msg'  => false, // ошибок нет
               'user_row'     => array(
               'user_id' => $row['user_id'], // идентификатор пользователя phpbb
             'username'       => $row['username'],  // Отображаемое имя пользователя
             'user_password'  => $row['user_password'],  // phpbb-хеш пароля
             'user_email'     => $row['user_email'],  // E-mail пользователя, если существует
             'user_type'      => 0, //тип пользователя (админне админ и т.д.)
             'group_id' => 2 // группа по умолчанию
             )
);

Все вроде бы понятно, но может возникнуть резонный вопрос — где брать 'user_id', если пользователь еще не зарегистрирован на форуме? Ответ тоже прост: Если пользователь еще не зарегистрирован, следует изменить значение ключа 'status' на LOGIN_SUCCESS_CREATE_PROFILE. В этом случае пользователь будет создан автоматически.

Во-вторых, наш плагин авторизации должен содержать функцию, которая будет автоматически производить регистрацию и авторизацию пользователя на форуме при первом посещении форума:

autologin_simple()

Функция должна возвратить ассоциативный массив со всей информацией о текущем пользователе.

Скажу сразу, что наш пример будет регистрировать вот такого пользователя:

function get_user_data()
{
       $result['user_email'] = “user@example.com”;
       $result['username'] = “username”;
       $result['user_password'] = “user_password”;

       return $result;
}

В реальном случае эта функция будет передавать данные из сессии текущего пользователя реального сайта.

Итак, содержимое нашего файла-плагина:

<?php

/**
*
* Пример плагина авторизации для phpBB3
*
*/

if (!defined('IN_PHPBB'))
{
   exit;
}

/**
* возвращает информацию о текущем пользователе
*/
function get_user_data()
{
       $result['user_email'] = “user@example.com”;
       $result['username'] = “username”;
       $result['user_password'] = “user_password”;

       return $result;
}

/**
* Функция, отвечающая за авторизацию.
*/
function login_simple(&$username, &$password)
{
    $auth = get_user_data();
   
    // если авторизация невозможна
    if (!is_array($auth) || empty($auth))
    {
       return array(
                   'status' => LOGIN_ERROR_USERNAME,
                   // сообщение по ключу ACCESS_DIRECTLY_DENIDED следует добавить в файлах language/<language>/common.php
                   'error_msg' => 'ACCESS_DIRECTLY_DENIDED',
                   'user_row' => array('user_id' => ANONYMOUS),
       );
    }
   
    global $db;
    $sql = 'SELECT user_id, username, user_password, user_passchg, user_email, user_type
           FROM ' . USERS_TABLE . "
           WHERE username_clean = '" . $db->sql_escape($auth['username']) . "'";
    $result = $db->sql_query($sql);
    $row = $db->sql_fetchrow($result);
    $db->sql_freeresult($result);
   
    if ($row){
       $res = array(
                   'status'     => LOGIN_SUCCESS,
                   'error_msg'  => false,
                   'user_row'     => array(
                       'user_id' => $row['user_id'],
                       'username'       => $row['username'],  // Отображаемое имя пользователя
                       'user_password'  => $row['user_password'],  // phpbb-хеш пароля
                       'user_email'     => $row['user_email'],  // E-mail пользователя, если существует
                       'user_type'      => 0,
                       'group_id' => 2
                       )
                   );
       return $res;
    }
       
    // Сообщаем, что авторизация прошла успешно.
    $res = array(
                       'status'     => LOGIN_SUCCESS_CREATE_PROFILE,
                       'error_msg'  => false,
                       'user_row'     => array(
                           "username"       => $auth['username'],  // Отображаемое имя пользователя
                           "user_password"  => phpbb_hash($auth['user_password']),  // phpbb-хеш пароля
                           "user_email"     => $auth['user_email'],  // E-mail пользователя, если существует
                           "user_type"      => 0,
                           "group_id" => 2
                       ),
    );
    return $res;
}

/**
* Функция, отвечающая за регистрацию и авторизацию пользователя при первом посещении.
*/
function autologin_simple()
{
    // логин и пароль будет получен в самой функции, передаем заглушку
    $u = "";
    $user_row = login_simple($u, $u);
    // если пользователь еще не зарегистрирован
    if ($user_row['status'] == LOGIN_SUCCESS_CREATE_PROFILE)
    {
       global $phpbb_root_path, $phpEx;
       if (!function_exists('user_add'))
       {
               include($phpbb_root_path . 'includes/functions_user.' . $phpEx);
       }
       $user_row['user_row']['user_id'] = user_add($user_row['user_row']);
    }
    // возвращаем данные пользователя
    global $db;
    $sql = 'SELECT * FROM ' . USERS_TABLE . " WHERE user_id = '" . $db->sql_escape($user_row['user_row']['user_id']) . "'";
    $result = $db->sql_query($sql);
    $row = $db->sql_fetchrow($result);
    $db->sql_freeresult($result);
    return $row;
}


?>

Ссылки

  • Пример плагина — эта статья побудила на написание этого топика. К сожалению предложенный там вариант не работает, но направление верное
  • Официальная wiki — все правильно, но без примеров

Автор: karbuzov

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js