Программная авторизация в PHPBB

Как мне кажется, форумы постепенно отживают свое и им на смену приходят другие формы общения. Однако они всё еще живы и нередко возникают вопросы их интергации с сайтом. Естественно при этом хотелось бы иметь единую прицедуру регистрации, дабы не заставлять пользователя дважды вводить логин и пароль.

Недавно мне довелось решать задачу интеграции сайта с phpbb. Исходные условия таковы:

Есть некоторый движок для сайта, который имеет собственную систему регистрации и авторизации пользователей. Требуется установить форум phpbb в папку forum и обеспечить программную авторизацию на нем в момент входа пользователя на основной сайт. Ситема регистрации и авторизации на самом форуме должна быть отключена. Код форума должен остаться неизменным.

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

Вот так выглядит минимальное окружение phpbb для работы с его функциями

  1.  
  2. $phpbb_root_path = "./forum/";
  3. $phpEx = 'php';
  4. define('IN_PHPBB', true);
  5. require($phpbb_root_path . 'config.php'); //настройки подключения к БД
  6. require($phpbb_root_path . 'includes/constants.' . $phpEx);
  7.  
  8. // Connect to DB
  9. require($phpbb_root_path . 'includes/db/' . $dbms . '.' . $phpEx);
  10. $db = new $sql_db();
  11. $db->sql_connect($dbhost, $dbuser, $dbpasswd, $dbname, $dbport, false,
  12. defined('PHPBB_DB_NEW_LINK') ? PHPBB_DB_NEW_LINK : false);
  13.  
  14. // Grab global variables, re-cache if necessary
  15. require($phpbb_root_path . 'includes/acm/acm_' . $acm_type . '.' . $phpEx);
  16. require($phpbb_root_path . 'includes/cache.' . $phpEx);
  17. $cache = new cache();
  18. $config = $cache->obtain_config();
  19.  
  20. require($phpbb_root_path . 'includes/utf/utf_tools.' . $phpEx);
  21. require($phpbb_root_path . 'includes/functions.' . $phpEx);
  22. require($phpbb_root_path . 'includes/functions_user.' . $phpEx);
  23. require($phpbb_root_path . 'includes/session.' . $phpEx);
  24. require($phpbb_root_path . 'includes/auth.' . $phpEx);
  25. require($phpbb_root_path . 'includes/template.' . $phpEx);
  26.  
  27. $template = new template();
  28. $user = new user();
  29. $auth = new auth();
  30.  

Ниже представлен небольшой интерфейс для работы с пользователями в БД форума

  1.  
  2. //Здесь надо подключить окружение форума phpbb
  3.  
  4. //Удаление пользователя из группы
  5. function phpbb_group_user_del($group_id, $user_id)
  6. {
  7. group_user_del($group_id, $user_id);
  8. }
  9.  
  10. //Добавление пользователя в группу
  11. function phpbb_group_user_add($group_id, $user_id)
  12. {
  13. group_user_add($group_id, $user_id);
  14. }
  15.  
  16. //Вход пользователя на форум.
  17. //Функция должна вызываться до любых операций вывода, так как она использует cookie
  18. function phpbb_login($username, $password)
  19. {
  20. global $user, $auth, $phpbb_root_path, $phpEx;
  21. $user->session_kill();
  22. $user->session_begin();
  23. $auth->acl($user->data);
  24. $user->setup('viewforum');
  25. $auth->login($username, $password);
  26. }
  27.  
  28. //Обновление информации о пользователе.
  29. function phpbb_user_update($user_id, $user_data)
  30. {
  31. global $db;
  32. $sql = 'UPDATE ' . USERS_TABLE . '
  33. SET ' . $db->sql_build_array('UPDATE', $user_data) . "
  34. WHERE user_id = $user_id";
  35. $db->sql_query($sql);
  36. }
  37.  
  38. //Функция добавляет пользователя на форум. Возвращает идентификатор добавленного пользователя.
  39. function phpbb_user_add($user_data)
  40. {
  41. $user_id = user_add($user_data);
  42. return $user_id;
  43. }
  44.  
  45. //Пример того, как все это работает
  46. $username = 'user' . (time() % 10000);
  47. //В user_data имена ключей совпадают с именами полей в таблице пользователей.
  48. //Перечисленные в примере поля являются обязательными, а все прочие - опциональными
  49. $user_data = array
  50. (
  51. 'username' => $username,
  52. 'user_password' => phpbb_hash('password'),
  53. 'user_email' => $username . '@mail.ru',
  54. 'group_id' => 9, //Номер группы надо подсмотерть в БД форума
  55. 'user_lang' => 'ru',
  56. 'user_type' => USER_NORMAL
  57. );
  58. $user_id = phpbb_user_add($user_data);
  59. if(time() % 2)
  60. {
  61. phpbb_group_user_del(9, $user_id);
  62. phpbb_group_user_add(8, $user_id);
  63. phpbb_user_update($user_id, array('user_real_name' => 'Woman ' . $username));
  64. }
  65. phpbb_login($username, 'password');
  66.  

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

Читайте в блоге

Получение уникального числа в коммандном файле Windows
TinyURL. Шаг 2. Кодирование и декодирование ссылки
JavaScript Преобразование массивов и объектов в строку

Метки: php phpbb

Комментарии:

Войдите на сайт, чтобы оставить комментарий