Совсем недавно возникла необходимость быстрой интеграции сайта и форума phpbb3. Погуглив, нормального примера не нашел. Пришлось писать самому. Возможно, кому-то пригодится.
Итак, пусть есть сайт, с собственной системой авторизации. Необходимо добавить форум phpbb с быстрым (и возможно даже правильным) решением проблем с интеграцией существующей пользовательской базы. Авторизация и регистрация новых пользователей по-прежнему будет происходить на сайте, в форум будут попадать уже зарегистрированные пользователи. Регистрация и авторизация на форуме будет закрыта.
Для начала отключим возможность регистрации новых пользователей:
Для этого в администраторском аккаунте перейдите на вкладку “Общие”, и в левом меню выберите “Регистрация пользователей”. Далее отключаем регистрацию:

Все плагины авторизации хранятся в поддиректории форума includes/auth/. Там уже есть несколько файлов-плагинов помимо стандартного auth_db. Добавляем свой плагин: пусть он будет называться auth_simple. Важно, что название файла будет определять названия содержащихся функций. Создаем файл includes/auth/auth_simple.php.
Как минимум, наш файл должен иметь функцию
login_simple(&$username, &$password)
Функция должна возвращать массив такого содержания:
Все вроде бы понятно, но может возникнуть резонный вопрос — где брать 'user_id', если пользователь еще не зарегистрирован на форуме? Ответ тоже прост: Если пользователь еще не зарегистрирован, следует изменить значение ключа 'status' на LOGIN_SUCCESS_CREATE_PROFILE. В этом случае пользователь будет создан автоматически.
Во-вторых, наш плагин авторизации должен содержать функцию, которая будет автоматически производить регистрацию и авторизацию пользователя на форуме при первом посещении форума:
autologin_simple()
Функция должна возвратить ассоциативный массив со всей информацией о текущем пользователе.
Скажу сразу, что наш пример будет регистрировать вот такого пользователя:
В реальном случае эта функция будет передавать данные из сессии текущего пользователя реального сайта.
Итак, пусть есть сайт, с собственной системой авторизации. Необходимо добавить форум phpbb с быстрым (и возможно даже правильным) решением проблем с интеграцией существующей пользовательской базы. Авторизация и регистрация новых пользователей по-прежнему будет происходить на сайте, в форум будут попадать уже зарегистрированные пользователи. Регистрация и авторизация на форуме будет закрыта.
Для начала отключим возможность регистрации новых пользователей:
Для этого в администраторском аккаунте перейдите на вкладку “Общие”, и в левом меню выберите “Регистрация пользователей”. Далее отключаем регистрацию:

Итак, начнем писать наш плагин:
Все плагины авторизации хранятся в поддиректории форума 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 — все правильно, но без примеров