Довольно часто возникает необходимость в интеграции phpBB с другой системой, например с Drupal или Joomla. В этом случае Вам повезло — готовые модули для использования единой базы пользователей c phpBB 3 в обоих системах уже созданы.
Если же Вам нужно сделать единую авторизацию с более экзотической системой, то придется все делать самому. Ну или заказать разработку у специалистов.
К счастью, разработчики phpBB предусмотрели эту проблему, и заранее сделали механизм авторизации легко расширяемым. В этой статье мы попробуем написать свой простой плагин авторизации.
Запрет регистрации
Логично предположить, что перед активацией нашего модуля авторизации мы должны запретить регистрацию в самом phpBB. Создавая плагин авторизации заранее предпологается, что пользователи будут регистрироваться в другом месте.
Для этого в администраторском аккаунте перейдите на вкладку Общие, и в левом меню выберите «Регистрация пользователей». Далее отключаем регистрацию:

Все плагины авторизации расположены в директории includes/auth/. Там уже есть несколько готовых плагинов.
- auth_db — плагин, включенный по умолчанию. Он отвечает за авторизацию через базу данных phpBB.
- auth_apache — плагин, соответственно для авторизации использующий встроенные средства веб-сервера Apache.
- auth_ldap — плагин, использующий для аутентификации сетевой протокол доступа к каталогам LDAP
Пусть наш плагин будет называться auth_simple. Создайте файл auth_simple.php в директории includes/auth с таким содержимым:
< ?php /** * * Пример плагина авторизации для phpBB3 * */ /** * @ignore */ if (!defined('IN_PHPBB')) { exit; } /** * Функция, отвечающая за авторизацию. */ function login_simple(&$username, &$password) { // Запрещаем пустой пароль. if (!$password) { return array( 'status' => LOGIN_ERROR_PASSWORD, 'error_msg' => 'NO_PASSWORD_SUPPLIED', 'user_row' => array('user_id' => ANONYMOUS), ); } // Запрещаем пустое имя пользователя. if (!$username) { return array( 'status' => LOGIN_ERROR_USERNAME, 'error_msg' => 'LOGIN_ERROR_USERNAME', 'user_row' => array('user_id' => ANONYMOUS), ); } // Обычная проверка на правильность. if ( ("test" === $username) && ("test" === $password) ) { // Сообщаем, что авторизация прошла успешно. return array( 'status' => LOGIN_SUCCESS, 'error_msg' => false, 'user_row' => array( "username" => $username, // Отображаемое имя пользователя "user_password" => phpbb_hash($password), // phpbb-хеш пароля "user_email" => "test@v673.com", // E-mail пользователя, если существует "user_type" => USER_NORMAL // Тип пользователя, объявленный в constants.php ), ); } // Возвращаем ошибку авторизации. return array( 'status' => LOGIN_ERROR_PASSWORD, 'error_msg' => 'LOGIN_ERROR_PASSWORD', 'user_row' => array('user_id' => ANONYMOUS), ); } ?>
Теперь необходимо активировать наш плагин авторизации. Для этого перейдите в вкладку Общие и в левом меню выберите пункт Аутентификация. Выберите наш метод авторизации:

Все! Сегодня мы спрограммировали небольшой плагин для системы авторизации. Теперь Вы можете легко интегрировать phpBB с различными системами. В другой статье, которую напишу позже, я расскажу Вам более подробно о создании плагинов аутентификации.
RSS
Есть мысли на этот счет:
ошибка —
Общая ошибка
Authentication method not found
происходит во время авторизации на форуме
Теперь другая картина... я вообще на форум попасть не могу! И в админку в частности !!! тоесть не могу вернуть auth_db на место!!!! как быть??? заменил код auth_simple.php кодом из auth_db — не помогло! как попасть в админку и вернуть все как было?
Здравствуйте. Спасибо за комментарий! Уверен, выбор метода авторизации прописан где-то в конфигурации. Для более подробной информации об этих тонкостях можете проконсультироваться на форуме phpbbguru.net.
Как на счет WordPress? На United надежды нет.
Писать плагин самому — плохая идея. Попробуйте подойти к решению проблемы с другой стороны. Можно воспользоваться bbPress от создателей WordPress? Или может поискать другие готовые плагины?
У меня phpbb3
Добрый день! Отличная статья, но как мне показалось, немного незаконченная: такую «авторизацию» убивает моментально, ещё до появления страницы «Вы успешно вошли в систему.», несмотря на то, что значения, возвращаемые написанным мною модулем полностью идентичны стандартному «auth_db.php». да и если поискать по коду форума «USERS_TABLE», можно много чего найти. Очевидно, нужна какая-то более детальная инструкция для авторизации по внешней таблице... Либо надо сразу же на лету при авторизации добавлять туда недостающие записи с правами доступа по умолчанию... Сейчас пытаюсь найти информацию, но пока ничего не нашел. У вас есть ещё какая-нибудь информация, буду благодарен. Если туплю — извините, phpbb только вчера установил первый раз.
Прошу прощения, какой-то глюк. расшифровываю:
все, разобрался сам. Стас, вы пропустили важный элемент в массиве «user_row»: «group_id», группа пользователя. Без неё user_add не работает, а её работоспособность необходима для создания обязательных записей в таблицах пользователей phpbb. Также я заменил все insert-ы в функции user_add на replace, это позволяет обновлять такие поля, как e-mail и группа пользователя при обычном его логине на форум.
для работы админки также необходимо подключение functions_user.php с помощью конструкции вида:
if (!function_exists ('user_add'))
{
if (file_exists ($phpbb_root_path . 'includes/functions_user.php')) include ($phpbb_root_path . 'includes/functions_user.php');
else include ($phpbb_root_path . '.../includes/functions_user.php');
}
Спасибо за очень полезный комментарий, bda!
Здравствуйте, bda, можете подробнее описать как же все таки сделать, что бы после того, как пользователь вошел и вывелось сообщение, что пользователь успешно вошел, сессия продолжалась?
Возможно я прописал не тот идентификатор группы?
if ( («test» === $username) && («test» === $password) )
{
// Сообщаем, что авторизация прошла успешно.
return array (
'status' => LOGIN_SUCCESS,
'error_msg' => false,
'user_row' => array (
«username» => $username, // Отображаемое имя пользователя
«user_password» => phpbb_hash ($password), // phpbb-хеш пароля
//"user_email" => «test@v673.com», // E-mail пользователя, если существует
«user_type» => USER_NORMAL, // Тип пользователя, объявленный в constants.php
«group_id» => REGISTERED // Идентификатор группы
),
);
}