Совсем недавно возникла необходимость быстрой интеграции сайта и форума phpbb3. Погуглив, нормального примера не нашел. Пришлось писать самому. Возможно, кому-то пригодится.
Итак, пусть есть сайт, с собственной системой авторизации. Необходимо добавить форум 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 — все правильно, но без примеров
Автор: karbuzov