Русское сообщество fluxbb

Быстрый лёгкий надёжный форумный движок

Вы не вошли.

Объявление

Вы можете внести свой вклад в содержание сайта. Жертвователи попадут в почетную группу "Спонсоры". Поддержать сайт.

#1 2014-01-18 14:08:08

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Интеграция самописной CMS с FluxBB

Собственно говоря, необходимо сделать общую систему учета (регистрации и авторизации) пользователей. В моей микро-CMS своя система учета юзеров имеется, но она мне ничем не дорога и она, наверняка, не лучше чем система учета пользователей флакса. Поэтому, для упрощения задачи, вполне можно использовать для сайтов на CMS систему учета пользователей флакса. При этом возникают два момента.

Первый. Сайт на CMS и FluxBB устанавливаются вместе, при этом для сайта  и для форума используется общая система учета пользователей флакса (на основе скриптов и таблиц БД флакса). При этом ссылки сайта типа Регистрация, Вход, Выход и пр. могут заводиться либо прямо на соответствующие скрипты (формы) флакса, либо можно сделать отдельные формы для сайта, более подходящие под дизайн сайта.

Второй. Сайт на CMS устанавливается без форума (без флакса), но с системой учета пользователей от флакса. Это сложнее. Придется взять таблицы БД и скрипты системы учета юзеров от флакса и инсталлировать их вместе с таблицами и скриптами самой CMS, и при этом они должны нормально работать в структуре CMS. Здесь надо проработать совместимость, но, имхо, это гораздо проще, чем совмещать две разные системы учета юзеров от CMS и от флакса.
При этом, если на такой форум потребуется установить форум на FluxBB, то все завязки системы учета юзеров CMS с таблиц и скриптов CMS должны (через файл конфигурации) переключиться на таблицы и скрипты флакса, а аналогичные таблицы и скрипты самой CMS могут быть при этом удалены. Примерно так.

Вроде все не так уж сложно, но, имхо, наверняка имеются подводные камни, которых я пока не вижу. Основное, это то что я плохо представляю себе работу системы учета пользователей FluxBB, и пока не представляю себе, как она будет (и сможет ли) работать отдельно от движка флакса совместно с CMS.

Вот потому-то прошу корифеев (знатоков флакса и систем учета пользователей на PHP и MySQL) подсказать, какие сложности могут возникнуть при реалицации моей идеи. И насколько она вообще правильна. А я пока полезу в скрипты и таблицы флакса, чтобы разобраться с его системой учета пользователей.

По мере продвижения своей затеи буду писать сюда кое-какую инфу, надеюсь, интересную не только мне. Вопросы построения общей системы учета пользователей для форума и CMS должны быть интересны многим.

Редактировался sadex (2014-01-20 19:19:40)

Offline

#2 2014-01-21 17:08:15

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Тупо-примитивный, но интересный эксперимент. Обратил внимание на то, что, например, формы входа на форум FluxBB (авторизации) и регистрации обрамлены только сверху и снизу - хидером и футером. Попробовал сначала убрать хидер - не получилось, форма не появляется. С футером, зато, получилось. Если в файлах login.php и register.php закомментировать последнюю строчку кода

require PUN_ROOT.'footer.php';

то формы регистрации и входа на сайт начинают выводиться в чистом виде, даже без стиля.
Но как эти формы внедрить в структуру сайта - не представляю себе, пока. Да и надо ли... Вот, например, более простое решение:
http://www.clippercms.com/forum/

Здесь сам форум флакса в структуре сайта, обрамлен сверху и снизу хидером и футером сайта. Проще не придумаешь. Но мне такое решение что-то не очень нравится. В идеале надо бы чтобы указанные выше  формы флакса могли бы встраиваться в структуру сайта, с дизайном сайта, но работать при этом со скриптами и таблицами БД флакса.

Редактировался sadex (2014-01-21 18:48:35)

Offline

#3 2014-01-23 10:29:11

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Пример встраивания формы входа FluxBB в шаблон главной страницы ST-CMS (SadexTest-CMS)

<?php

/**
 * Copyright (C) 2014 ST-CMS
*/

define('ST_ROOT', dirname(__FILE__).'/'); // путь к корню ST-CMS

$stat='<form id="login" method="post" action="xba/login.php?action=in" onsubmit="return process_form(this)">';
$stat.='<div class="inform">
<fieldset>
<legend>Введите имя пользователя и пароль</legend>
<div class="infldset">
<input type="hidden" name="form_sent" value="1" />
<input type="hidden" name="redirect_url" value="http://st/xba/index.php" />
<label class="conl required"><strong>Имя <span>(Обязательно)</span></strong><br /><input type="text" name="req_username" size="25" maxlength="25" tabindex="1" /><br /></label>
<label class="conl required"><strong>Пароль <span>(Обязательно)</span></strong><br /><input type="password" name="req_password" size="25" tabindex="2" /><br /></label>';

$stat.='<div class="rbox clearb">
<label><input type="checkbox" name="save_pass" value="1" tabindex="3" />Узнавать меня автоматически при каждом посещении.<br /></label>
</div>
<p class="clearb">Если вы ещё не зарегистрированы или забыли пароль, кликните на подходящей ссылке внизу.</p>
<p class="actions"><span><a href="xba/register.php" tabindex="5">Ещё не зарегистрированы?</a></span><span><a href="xba/login.php?action=forget" tabindex="6">Забыли пароль?</a></span></p>
</div>
</fieldset>
</div>
<p class="buttons"><input type="submit" name="login" value="Вход" tabindex="4" /></p>
</form>';

// Включение шаблона главной страницы ST-CMS
include_once(ST_ROOT.'psdv/tpl/main.php');

?>

Пояснения к скрипту.

В шаблоне ST-CMS эта форма выводится так: <?=$stat?>. Такой способ сборки формы в переменную и последующего вывода этой переменной в шаблоне позволяет вывести форму в любой удобной для этого области страницы CMS.

В папке xba/ у меня расположены файлы FluxBB.

При вводе данных в форму и нажатии кнопки "Вход" данные формы передаются на скрипт login.php FluxBB по ссылке xba/login.php?action=in, что указано в атрибуте action.

JS-обработчик onsubmit="return process_form(this)" также можно включить в переменную $stat.

Работа при входе/авторизации из данной формы проверена, скрипты FluxBB работают нормально.

По такому принципу, надеюсь, можно выводить любую форму системы входа/регистрации FluxBB на странице сопряженной с FluxBB и работать через нее.

Редактировался sadex (2014-01-23 10:33:55)

Offline

#4 2014-01-29 15:52:11

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

В системе учета пользователей флакса используются всего три формы - Вход, Регистрация и Запрос_пароля (по ссылке Забыли пароль? из формы Входа). Поначалу я выдрал все три формы из флакса и всадил их в свои скрипты логина и регистрации CMS. Все работает, в случае отсутствия ошибок ввода (имеются ввиду не простые ошибки заполнения полей форм, которые, в скриптах логина и регистрации CMS, также нормально обрабатываются через взятые у флакса JS-обработчики первичной валидации на клиенте). Имеются в виду серьезные обработчики на PHP, довольно сложные, которые только для простейшей формы Запрос_пароля делают много чего навороченного.

В итоге оставил на сайте ST-CMS только форму Входа, остальную обработку перенаправляю на формы и скрипты флакса. Это удобно. Форма входа у сайта своя, ей юзеры наиболее часто пользуются. Форма Регистрации на флаксе - для сайта и форума общая. Форма Запрос_пароля на флаксе - для сайта и форума общая.

Идентификация на сайте юзера по кукам

Это серьезная вещь, но удалось. Цель была чтобы только с помощью сриптов сайта определять куки юзера, проверять их по таблице users флакса и выводить на сайте сообщения типа Вы_не_вошли (если юзер не авторизован) и Вы_вошли_как + логин_юзера, если юзер авторизован.

Простой способ

// Из FluxBB. Определение имени текущего пользователя
define('PUN_ROOT', dirname(__FILE__).'/xba/'); // путь к корню FluxBB
include_once(PUN_ROOT.'include/common.php');
$cuser = $pun_user['username'];

Все работало. В результате, подключение common.php, который внутри себя подключает кучу всего, включая массивный functions.php (аж на 76 Кб) увеличило время генерации страниц сайта CMS в девять (!) раз. И это только для того, чтобы определить по кукам какой юзер вошел и вывести приветствие с его логином. Такой расклад, конечно, не устроил.

Сложный, но скоростной способ

Из фласка полключаю только маленький config.php. Для сайта сделал небольшой файл с нужными функциями флакса, их пока оказалось всего три, это

check_cookie($pun_user); // сильно измененная и урезанная
forum_hmac($data, $key, $raw_output = false);
pun_hash($str); // взял только для красоты и с учетом будущего развития флакса, т.к. это только оболочка sha1($str)

В принципе еще нужна get_remote_address(), но она после детального рассмотрения превращается просто в
$remote_addr = $_SERVER['REMOTE_ADDR'];
С прокси пока я дел иметь не собираюсь.

Как урезать check_cookie() подсмотрел у Visman-а здесь:
https://fluxbb.qb7.ru/forum/viewtopic.php?id=3564
Весьма толковые и полезные рекоменации.

Этот скоростной способ при выводе на страницах сайта (CMS) имени (логина) залогиненного пользователя и ссылок Вход | Регистрация и Выход дал увеличение времени генерации страниц сайта всего в два раза. Это хороший показатель, по сравнению с простым способом. У меня скрипты сайта работают очень быстро, поэтому дополнительные издержки по снижению скорости вывода страниц - в два раза - вполне допустимы, для такого дела.

Редактировался sadex (2014-01-31 09:50:07)

Offline

#5 2014-01-29 16:19:04

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Вот код скрипта с измененной check_cookie()

include_once('xba/config.php'); 

// Check/update/set cookie and fetch user info
$pun_user = array();
check_cookie($pun_user);

function check_cookie(&$pun_user) {

global $db, $db_type, $pun_config, $cookie_name, $cookie_seed;
global $db_host, $db_username, $db_password, $db_name, $db_prefix;

$now = time();

if (isset($_COOKIE[$cookie_name]) && preg_match('%^(\d+)\|([0-9a-fA-F]+)\|(\d+)\|([0-9a-fA-F]+)$%', $_COOKIE[$cookie_name], $matches)) {
        $cookie = array(
            'user_id'            => intval($matches[1]),
            'password_hash'     => $matches[2],
            'expiration_time'    => intval($matches[3]),
            'cookie_hash'        => $matches[4],
        );
}

 // If it has a non-guest user, and hasn't expired
    if (isset($cookie) && $cookie['user_id'] > 1 && $cookie['expiration_time'] > $now)
        if (forum_hmac($cookie['user_id'].'|'.$cookie['expiration_time'], $cookie_seed.'_cookie_hash') == $cookie['cookie_hash']) {

// Check if there's a user with the user ID and password hash from the cookie
$cuser_id = intval($cookie['user_id']);
$tbl = $db_prefix.'users'; // имя таблицы БД для выборки 
$link = mysqli_connect($db_host, $db_username, $db_password, $db_name); // работаем с mysqli
$sql = "SELECT id, group_id, username, password FROM $tbl WHERE id=$cuser_id";
$result = mysqli_query($link, $sql);
$pun_user = mysqli_fetch_assoc($result);

mysqli_free_result($result);
mysqli_close($link);

//echo '<br> id: '.$pun_user['id'].', pw: '.$pun_user['password'].', name: '.$pun_user['username'];

if (isset($pun_user['id']) && forum_hmac($pun_user['password'], $cookie_seed.'_password_hash') === $cookie['password_hash']) {

//echo '<br>'.'юзер определен и его данные находятся в $pun_user';
//echo '<br>$cookie[password_hash]: '.$cookie['password_hash'];
            }
        }

} //end of function stcheck_cookie()

Код весьма сырой, но работает. Здесь выложил для того, чтобы кто-то что-то подсказал.

Редактировался sadex (2014-01-30 18:59:55)

Offline

#6 2014-01-29 16:35:39

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Сборка ссылки Выход с токеном для выхода пользователя с сайта

Для начала, смотрим что она из себя представляет на флаксе (на моем локальном Денвере):
http://st/xba/login.php?action=out&id=2&csrf_token=40ce5abbaf76ba6fe66bb8a833eb9e8d4da5c273

С параметрами action и id проблем, естественно, не возникло. А вот с токеном пришлось повозиться. Он в login.php флакса формируется и проверяется заморочистым способом:
if ... $_GET['csrf_token'] == pun_hash($pun_user['id'].pun_hash(get_remote_address())))

Т.е. делается совместный хеш id и удаленного адреса пользователя. Для чего и понадобились функции хеширования в списке выше. Но токен для ссылки Выход на сайте я таки собрал довольно простым способом:

// Сборка сообщений о входе/выходе и ссылок Входа, Регистрации и Выхода (сайта ST)
include_once(ST_ROOT.'stfunc.php');
if($pun_user['username']=='') {
$cuser = 'Вы не вошли.';
// Ссылки Вход и Регистрация 
$login_ref = '<a href="stlogin.php">Вход</a>&nbsp;|&nbsp;<a href="xba/register.php">Регистрация</a>';
} else {
$cuser = 'Здравствуйте, <strong>'.$pun_user['username'].'</strong>';
// Ссылка Выход 
$token = pun_hash($pun_user['id'].pun_hash($_SERVER['REMOTE_ADDR']));
$login_ref = '<a href="xba/login.php?st=1&action=out&id='.$pun_user['id'].'&csrf_token='.$token.'">Выход</a>';

Более-менее пока все вроде работает - подробности особо не проверял. Пока не занимался редиректом на нужные страницы сайта после Входа (очень надо) и Выхода (не особенно надо, но горбато сделал).

Для редиректа есть у флакса функция redirect($destination_url, $message), заморочистая, однако. Кое-как она у меня работает, для редиректа на страницы сайта CMS, но горбато и сыро все. Надо разбираться с редиректом.

Цель - сделать такой же редирект, как у флакса, когда посетитель открывает произвольную страницу форума, с нее логинится и на нее же редиректится после залогинивания, уже как пользователь..

UPD. Несколько улучшил код проверки авторизации посетителя сайта

// Сборка сообщений о входе/выходе и ссылок Входа, Регистрации и Выхода (сайта ST)

//По умолчанию, для произвольного посетителя
$cuser = 'Вы не вошли.';
// Ссылки Вход и Регистрация 
$login_ref = '<a href="stlogin.php">Вход</a>&nbsp;|&nbsp;<a href="xba/register.php">Регистрация</a>';

// Проверка - авторизован ли посетитель 
include_once(ST_ROOT.'xba/config.php'); 
if (isset($_COOKIE[$cookie_name])) { // у юзера есть кука данного форума флакса
include_once(ST_ROOT.'stfunc.php');
if(!empty($pun_user['username'])) { // у юзера не пустое значение имени (логина)
$cuser = 'Здравствуйте, <strong>'.$pun_user['username'].'</strong>';
// Ссылка Выход 
$token = pun_hash($pun_user['id'].pun_hash($_SERVER['REMOTE_ADDR']));
$login_ref = '<a href="xba/login.php?st=1&action=out&id='.$pun_user['id'].'&csrf_token='.$token.'">Выход</a>';
} // сложная проверка - у юзера пустое значение логина
} // быстрая проверка - у юзера нет куки форума

Разница в том, что если у посетителя отсутствует кука форума, то он дальше не проверяется и файл с функциями авторизации stfunc.php не подключается в скрипт. Это дает некоторый выигрыш по ресурсам (скорости и памяти), когда на сайт заходит незнакомый или неавторизованный посетитель, у которого кука флакса в браузере отсутствует. А таких посетителей, которые только просматривают страницы сайта и форума может быть много.

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

Редактировался sadex (2014-01-31 09:55:00)

Offline

#7 2014-01-30 11:27:48

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Редирект на страницу, с которой логинился пользователь, после логина

Все оказалось проще пареной репы. В форме Входа (логина) от флакса уже имеется скрытое поле с именем name="redirect_url". Значит, в скрипте логина сайта, который выводит это поле (в форме Входа с сайта), получаем адрес страницы, на которую нужно вернуться после логина:

$redirect_url = $_SERVER['HTTP_REFERER'];

Полученное значение $redirect_url вставляем в поле формы

<input type="hidden" name="redirect_url" value="$redirect_url" />

После этого скрипт флакса login.php, который получает данные этой формы, логинит пользователя,  обрабатывает полученный для возврата url и происходит необходимый редирект пользователя на страницу сайта, с которой он логинился.

Offline

#8 2014-04-12 11:43:30

sadex
Участник
Зарегистрирован: 2013-06-01
Сообщений: 103
Сайт

Re: Интеграция самописной CMS с FluxBB

Интеграция, вернее детализация интеграции, продолжается. Удалось сделать так, чтобы в скриптах интегрируемой CMS авторизация и авто-авторизация работали (с установкой и без установки галочки Remember Me - "Узнавать меня автоматически...") примерно так же, как и во флаксе. Но пришлось повозиться. Поэтому, для начала, надо бы составить хоть какое-то описание процессов авторизации и авто-авторизиции у флакса.

Введем понятия

Краткосрочный период – период, задаваемый в в o_timeout_visit, по умолчанию – полчаса.
Продленный период – период, равный 14 дням.
Гостевой период – период, устанавливаемый для гостя и равный одному году.
Авторизация краткосрочная, на время заданное в o_timeout_visit, по умолчанию – полчаса.
Авторизация продленная, на 14 дней, при установленной галочке Remember Me.
Кука флакса краткосрочная, устанавливаемая при краткосрочной авторизации, с временем жизни полчаса.
Кука флакса продленная, устанавливаемая при продленной авторизации, с временем жизни 14 дней.
Кука флакса гостевая, уст. на 1 год гостю, не прошедшему авторизацию либо участнику, вышедшему с форума.
Авто-авторизация краткосрочная – авто-авторизация при заходе пользователя на сайт в краткосрочный период.
Авто-авторизация продленная – авто-авторизация при заходе пользователя на сайт в продленный период.

Ключевые тезисы для описания

* Имя куки флакса - хранится в файле config.php в переменной $cookie_name, имеет значение типа pun_cookie_df59b7, и задается один раз - при инсталляции флакса.

* Кука флакса в первый раз устанавливается в браузер посетителя при регистрации посетителя в качестве участника форума FluxBB. Это делается посредством вызова функции pun_setcookie() в файле register.php (строка 252), при этом сама функция pun_setcookie() находится (объявляется) в файле functions.php (строка 329). Функция pun_setcookie() (в файле functions.php) является оболочкой для функции forum_setcookie() в том же файле (строка 340). Именно функция pun_setcookie() использует переменную $cookie_name при вызове функции forum_setcookie() в которой значение переменой $cookie_name присваивается переменной $name. Затем переменная $name используется уже в функции setcookie() (находящейся в теле функции forum_setcookie()) для первой установки в браузер пользователя куки флакса с именем, задаваемым значением переменной $name (именем типа pun_cookie_df59b7).

* Кука флакса при авторизации (аутентификации) пользователя проверяется в файле login.php и при успешной авторизации переустанавливается в браузере пользователя.

* Кука флакса при авто-авторизации проверяется через файлы index.php, включающем common.php, включающем functions.php (строка 42 в common.php) вызовом функцией check_cookie() (строка 154 в common.php), и при успеш-ной авто-авторизации переустанавливается функцией pun_setcookie() (в файле functions.php).

Редактировался sadex (2014-04-12 11:50:00)

Offline

Подвал доски

Под управлением FluxBB. Хостинг Hostens