Sergey M Nikitin |
08.01.2008 15:32 |
Сессия из глобальной переменной [ЗАДАЧА РЕШЕНА]
[ЗАДАЧА РЕШЕНА]
Столкнулся с такой проблемой
Решил внедрить в свой TYPO проект SWF upload модуль.
Модуль работает по принципу AJAX, но проблема заключается в том что SWF файл не передает скрипту данные о сессии, что очень важно, есть ли какой-нибудь способ передать TYPO'е ключ сессии, чтобы он ее воспринимал на том же уровне как и ключ из COOKIE.
Что пробовал
1. Порылся в классах авторизации и наткнулся на FE_SESSION_KEY, по идеи он используется для переноса сессии с одного домена на другой но в моем случае должен был работать - не работает
2. Там же встретил проверку _GP("ftu") при передачи - не работает
3. Там же встретил проверку _GP("fe_typo_user") при передачи - не работает
4. Множество хаков - типа подмена $_COOKIE['fe_typo_user'] тоже не дало результатов, кто найдет решение, ОГРОМНОЕ СПАСИБО и модуль пользовательской загрузки в подарок с TS настройщиком и прочими вкусностями. [РЕШЕНИЕ#2 FE_SESSION_KEY (works !!!) ]
Чтобы получить FE_SESSION_KEY дальше через USER_INT на страницу
PHP код:
FE_SESSION_KEY = $GLOBALS["TSFE"]->fe_user->id. "-".md5($GLOBALS["TSFE"]->fe_user->id. "/".$GLOBALS["TYPO3_CONF_VARS"]["SYS"]["encryptionKey"];
[РЕШЕНИЕ#1 ХАК]
Делаем не большой хак (кстати я думаю его можно сделать и другим способом "плугином"), но так просто нагляднее.
в index.php в корне добавляем перед инклюдом index_ts.php, можно добавить проверку и длину и символов, но это не принципиально.
PHP код:
if (isset($_POST['fe_typo_user'])) { $_COOKIE['fe_typo_user'] = $_POST['fe_typo_user']; }elseif (isset($_GET['fe_typo_user'])){ $_COOKIE['fe_typo_user'] = $_GET['fe_typo_user']; }
require (PATH_tslib.'index_ts.php');
что получается: если вдруг нам передадут методом GET или POST переменную fe_typo_user то мы ее подменяем в COOKIE тем самым эмулируем то что swf клиент работает с куками.
дальше самое главное в чем в в общем и была проблема это ses_hashlock
структура таблицы fe_sessions
Код:
ses_id varchar(32) Нет
ses_name varchar(32) Нет
ses_iplock varchar(39) Нет
ses_hashlock int(11) Нет 0
ses_userid int(11) Нет 0
ses_tstamp int(11) Нет 0
ses_data blob Нет
ses_permanent tinyint(1) Нет 0
ses_hashlock служит для блокировки сессии в зависимости от браузер, так как данные передаются через swf плугин, то он отправляет пустой USER_AGENT, в результате обработчик сессии просто не может найти эту запись в базе так как ищет совершенно другой ses_hashlock
что сделать:
Код:
$TYPO3_CONF_VARS['FE']['lockHashKeyWords'] = 'useragent';
Присваиваем пустую строку в localconf.php.
$TYPO3_CONF_VARS['FE']['lockHashKeyWords'] = '';
либо меняем значение в инсталяторе как вам удобнее
УРА !!! ВСЕ РАБОТАЕТ !!!
|