Пишу собственный плагин аутентификации через phpbb3. Искал существующий с нужным мне функционалом - не нашёл. Из того, что есть - пробовал через mysql. Работает, но требуется отдельно логиниться в wiki, что не есть удобно (хотя и не надо отдельно регистрирваться - используются регистрационные данные из phpbb3).
В общем, пошёл таким путём (через имплементацию trustExternal ):
1. Цепляюсь к базе форума и беру из таблицы, в которой живут параметры конфигурации, базовое имя куки. Запрос такой:
select * from {$prefix}config where config_name = 'cookie_name';
{$prefix} - префикс имён таблиц базы данных форума, такой же как в конфиге phpbb3
2. Добавляю к базовому имени куки суффикс _sid и читаю куку с таким именем.
3. Если такой куки нет, значит на форуме пользователь не был и может быть только гостем.
Если кука есть - делаю ещё один запрос к базе (в $cookie_sid_value - содержимое куки):
select * from {$prefix}sessions where session_id = '{$cookie_sid_value}';
Записи в базе может не быть совсем (сессия просрочена, пользователь - гость).
Если запись есть, проверяем в ответе session_user_id - это id пользователя на форуме. Если =1, то это опять таки гость (пользователь на форум зашёл, но не залогинился - сессия для него существует)
Если session_user_id не равен 1, значит есть залогиненный пользователь. В таком случае:
4. Запрос на получение имени пользователя:
select * from {$prefix}users where user_id = '{$user_id}'
Имя пользователя будет в ответе в username (или регистронезависимое - в username_clean)
Запрос на получение групп, у которые пользователь входит (можно использовать в acl):
select * FROM {$prefix}groups g, {$prefix}users u, {$prefix}user_group ug WHERE u.user_id = ug.user_id AND g.group_id = ug.group_id AND u.user_id={$user_id};
Групп может быть несколько, названия возвращаются в group_name.
Вроде как всё, можно ставить true в trustExternal, но остаётся несколько непонятных моментов:
1. Обработка ошибок. Запросы к БД могут быть неуспешными (неправильная конфигурация, битая база, ещё какие-либо проблемы), как вернуть состояние, чтобы было понятно, что за ошибка произошла?
2. Хранение конфигурации. Не могу понять, каким образом другие плагины подключаются к общей конфигурилке dokuwiki. Пока что сохранил все параметры прямо в исходнике плагина, но это есть неправильно. Кроме того, там каким-то образом подключаются языковые файлы - тоже не понял, как.
3. Возврат значений. Как мне вернуть в dokuwiki информацию об имени пользователя и его группах?