Расскажите об аутентификации в phpbb

Проблемы с установкой или работой phpBB 2.0.x? Ищите ответы здесь!
Ivantor

Расскажите об аутентификации в phpbb

Сообщение Ivantor »

Уважаемые гуру, подскажите пожалуйста.
Когда пользователь устанавливает автозалогинивание, информация о нем, естественно, устанавливается в куку. Как я понял, она называется <имя куки>_data.
В связи с этим два вопроса.
1. Стоит задача определить, залогиненный это пользователь или нет, в домене уровнем выше, чем форум - то есть форум находится в домене forum.domen.ru, а куку хочется считать из domen.ru или www.domen.ru Вопрос - устанавливается ли кука по умолчанию так, чтобы это было возможно сделать, а если нет, то как доработать?
2. С кукой сессии <имя куки>_sid всё понятно, а вот что из себя структурно представляет кука <имя куки>_data ? Судя по всему, там содержится хэш пароля, что-то еще...
выглядит она так:
<некая последовательность>autologinid<некая последовательность>userid<некая последовательность>
Каким образом ее стоит разбирать, дабы соотнести с конкретным пользователем из таблицы users?
спасибо.
Аватара пользователя
crash
Former team member
Сообщения: 6517
Зарегистрирован: 20 лет 9 месяцев
Откуда: Бердск

Сообщение crash »

Ivantor писал(а):Стоит задача определить, залогиненный это пользователь или нет, в домене уровнем выше
Именно через cookie это сделать нереально.
Как правильно задавать вопросы
Для особо одаренных: поиск - это есть круто.
FAQ v.2 | FAQ v.3 | Шаблон запроса
Xpert
phpBB Guru
phpBB Guru
Сообщения: 5484
Зарегистрирован: 21 год 1 месяц
Поблагодарили: 2 раза

Сообщение Xpert »

Ivantor писал(а):а вот что из себя структурно представляет кука <имя куки>_data
Она из себя представляет сериализованный массив данных. В php превратить его обратно в массив можно функцией unserialize.
В нем 2 переменные

Код: Выделить всё

$sessiondata['autologinid'];
$sessiondata['userid']
Первое - это ключ логина, который содержится в таблице phpbb_session_keys. Он случаен и информации о пароле не несет, используется для запоминания на форуме.
С конкретным пользователем это соотносится таким запросом

Код: Выделить всё

			$sql = 'SELECT u.* 
				FROM ' . USERS_TABLE . ' u, ' . SESSIONS_KEYS_TABLE . ' k
				WHERE u.user_id = ' . (int) $user_id . "
					AND u.user_active = 1
					AND k.user_id = u.user_id
					AND k.key_id = '" . md5($sessiondata['autologinid']) . "'";
При этом нужно учитывать что

Код: Выделить всё

	//
	// Are auto-logins allowed?
	// If allow_autologin is not set or is true then they are
	// (same behaviour as old 2.0.x session code)
	//
	if (isset($board_config['allow_autologin']) && !$board_config['allow_autologin'])
	{
		$enable_autologin = $sessiondata['autologinid'] = false;
	}
Эксперт - это человек, который избегает мелких ошибок на пути к грандиозному провалу.
Любая более-менее сложная задача имеет несколько простых, изящных, лёгких для понимания неправильных решений
Ivantor

Сообщение Ivantor »

Xpert
поигрался и попытался поанализировать эту самую куку (на моей платформе всё-таки дикие проблемы с deserialize, приходится парсить как строку).

a:2:{s:11:"autologinid";s:32:"2153ae6df7348932f14daf71f2ccdfe7";s:6:"userid";i:2;} - залогинен с запоминанием
a:2:{s:11:"autologinid";s:32:"1b592ef33bba0f627953c1ff3fc824c6";s:6:"userid";s:1:"2";}
a:2:{s:11:"autologinid";s:32:"0c2605000f02c6be8c242fc081b816c1";s:6:"userid";i:2;}
a:2:{s:11:"autologinid";s:32:"f16d743388985f060dd5c8a034494e5a";s:6:"userid";s:1:"2";}
a:2:{s:11:"autologinid";s:0:"";s:6:"userid";i:-1;} - отлогинен
a:2:{s:11:"autologinid";s:0:"";s:6:"userid";s:1:"2";} - без запоминания, тока в течение текущей сессии

Собственно, получается, что в случае, если s:32, то в куке есть автологинид. если s:0 - то нету. Замечательно.

Цифра 2 - это мой юзер_ид
почему-то на конце строк получается либо
s:1:"2";
либо
i:2

1. Вы не могли бы разъяснить разницу между этими случаями, в каком случае что на конце куки возникает?
2. Что означает a:2 s:11 в начале строк, и правильно ли я понимаю, что они не меняются никогда, также как и s:6 в середине строки?
Аватара пользователя
svk
phpBB 2.0.3
Сообщения: 384
Зарегистрирован: 19 лет 9 месяцев
Откуда: Москва, Fortuna-net

Сообщение svk »

это внутренний формат функции serialize(). так что тебе скорее на форум http://php.ru с такими вопросами. парсить эту вещь как строку - изврат. unserialize() должны корректно работать на всех платформах, где запускается интерпритатор php
NETBYNET Holding system administrator
Аватара пользователя
m157y
phpBB 2.0.2
Сообщения: 340
Зарегистрирован: 18 лет 8 месяцев

Сообщение m157y »

2 svk
учитывая, что желает парсить как строку, тк проблемы с
deserialize
то думаю просто кому-то стоит сначала пхп чуть-чуть подучить, а после трогать phpBB )
Помните на форуме демократии нету, все делается так как вздумается администрации и правым быть вы не можете..
Ivantor

Сообщение Ivantor »

svk писал(а):так что тебе скорее на форум http://php.ru с такими вопросами. парсить эту вещь как строку - изврат. unserialize() должны корректно работать на всех платформах, где запускается интерпритатор php
m157y писал(а):то думаю просто кому-то стоит сначала пхп чуть-чуть подучить, а после трогать phpBB )
m157y
вашим советом воспользуюсь как-нить в другой раз - разработка ведется на ASP/Vbscript. ...может быть Вы, как знаток php и функции serialize в частности, ответите мне? :) Аналогов этой функции на vbscript нет, надо либо писать ее с нуля, либо - парсить строку.

Добавлено спустя 25 минут 28 секунд:

svk
спасибо за хороший совет, на php.ru нашел, оказывается, всё очень просто

Код: Выделить всё

<?
/*
Anatomy of a serialize()'ed value:

 String
 s:size:value;

 Integer
 i:value;

 Boolean
 b:value; (does not store "true" or "false", does store '1' or '0')

 Null
 N;

 Array
 a:size:{key definition;value definition;(repeated per element)}

 Object
 O:strlen(object name):object name:object size:{s:strlen(property name):property name:property definition;(repeated per property)}

 String values are always in double quotes
 Array keys are always integers or strings
    "null => 'value'" equates to 's:0:"";s:5:"value";',
    "true => 'value'" equates to 'i:1;s:5:"value";',
    "false => 'value'" equates to 'i:0;s:5:"value";',
    "array(whatever the contents) => 'value'" equates to an "illegal offset type" warning because you can't use an
    array as a key; however, if you use a variable containing an array as a key, it will equate to 's:5:"Array";s:5:"value";',
     and
    attempting to use an object as a key will result in the same behavior as using an array will.
*/
?>
правда, неясно, почему в phpbb в некоторых случаях юзер_ид сериализуется как строка, а в некоторых - как целое число :(

Вернуться в «Поддержка phpBB 2.0.x»