Доступ к данным сеанса за пределами Joomla
Я пытаюсь запустить приложение вне Joomla (а не как плагин), и я хотел бы получить доступ к зарегистрированной пользовательской информации (userid). Мне интересно, как мне это сделать? Есть ли файл, который я могу включить? Я попытался использовать $_SESSION, но он показывает пустой.
Есть ли простое решение моей проблемы? Спасибо за ваше время.
Ответы
Ответ 1
На самом деле это не так просто, как кажется. Joomla использует собственную обработку сеанса с уникальным генерированием сеанса-идентификатора и некоторым шифрованием, поэтому единственный способ получить данные сеанса Joomla - использовать соответствующие функции Joomla (как предложили другие). Недавно у меня был проект, в котором нам нужно было перевести аутентифицированного пользователя Joomla в отдельное приложение. Мы сделали это, добавив адаптер Joomla, который создает пользовательские классы Joomla, считывает пользовательские данные, помещает все в зашифрованный файл cookie и перенаправляет обратно в наше приложение. Там мы читаем зашифрованный файл cookie, создаем экземпляр собственного объекта пользователя и отбрасываем cookie. Поскольку это не на 100% безопасно, мы меняем систему, чтобы записывать пользовательские данные в таблицу базы данных и читать ее из нашего приложения - мы избегаем небезопасного способа с помощью файла cookie таким образом, потому что хотя cookie шифруется (и содержит конфиденциальную информацию пользователя, достаточную для аутентификации пользователя), она будет перенесена на провод и может быть обнюхана.
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$mainframe = JFactory::getApplication('site');
Вышеописанное является основным script, необходимым для доступа к ресурсам Joomla.
Ответ 2
define( '_JEXEC', 1 );
define('JPATH_BASE', 'your joomla basedir goes here' );
define( 'DS', DIRECTORY_SEPARATOR );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
JDEBUG ? $_PROFILER->mark( 'afterLoad' ) : null;
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
JPluginHelper::importPlugin('system');
JDEBUG ? $_PROFILER->mark('afterInitialise') : null;
$mainframe->triggerEvent('onAfterInitialise');
$user =& JFactory::getUser();
if ($user->guest) {
echo 'stuff';
//redirect('/');
} else {
echo 'user';
}
Ответ 3
Решение состоит в том, чтобы установить сеанс для всего домена и/или сайта. Это применяется, если вы пытаетесь получить доступ к данным сеанса вне области joomla. Например, если ваш сайт joomla находится на http://example.com/joomla/ и ваш другой сайт на http://othersite.example.com/, то cookie, содержащий идентификатор сеанса, не передается с joomla на другой сайт. Чтобы изменить это поведение, используйте session_ set_ cookie_ params перед каждым session_start() (я не очень хорошо знаю joomla, но вам нужно добавить только несколько строк кода). Используйте его следующим образом:
session_set_cookie_params(86400, '/', '.example.com');
86400 - это время жизни сеанса, настроенное на то, что вы предпочитаете (86400 - один день).
'/' - путь к файлу cookie. Это означает, что если ваш сайт joomla находится на http://example.com/joomla/, файл cookie сеанса будет по-прежнему отправляться, если пользователь обратится к http://example.com/.
'. example.com' - это домен. Обратите внимание на точку в начале, это очень важно. В нем говорится, что cookie сеанса будет отправлен на любой субдомен example.com. Если вы его не поместите, cookie будет отправлен только для адресов, начинающихся с http://example.com/.
Это должно решить вашу проблему, если вы не пытаетесь получить доступ к данным сеанса из другого домена. Если это так, оставьте здесь комментарий, я посмотрю, найду ли я что-нибудь что-нибудь.
Ответ 4
Решение, показанное Stefan Gehrig
define( '_JEXEC', 1 );
define('JPATH_BASE', dirname(dirname(__FILE__)));
define( 'DS', DIRECTORY_SEPARATOR );
require_once (JPATH_BASE . DS . 'includes' . DS . 'defines.php');
require_once (JPATH_BASE . DS . 'includes' . DS . 'framework.php');
$mainframe = JFactory::getApplication('site');
отлично работает, я провел много долгих ночей, пытаясь получить доступ к Joomla! ресурсов вне папки joomla.
$session = &JFactory::getSession();
В следующем коде работает нормально, когда был вызван метод getApplication
.
Спасибо за решение.
Ответ 5
Прежде всего, вы должны предоставить определение некоторым константам joomla (идентификаторам) следующим образом:
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE',$_SERVER['DOCUMENT_ROOT'].DS. basename(dirname(__DIR__)) );
где: JPATH_BASE представляет корневой каталог вашего сайта. Это должно быть правильно.
После этого вы должны использовать ключевые файлы следующим образом:
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
После этого вам нужно создать объект приложения и инициализировать его также:
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
[это необязательно] Если вы хотите импортировать некоторые другие библиотеки, вы можете сделать это следующим образом:
jimport( 'joomla.user.user');
jimport( 'joomla.session.session');
jimport( 'joomla.user.authentication');
Итак, основной код для вашего файла выглядит следующим образом:
define( '_JEXEC', 1 );
define( 'DS', DIRECTORY_SEPARATOR );
define( 'JPATH_BASE',$_SERVER['DOCUMENT_ROOT'].DS. basename(dirname(__DIR__)) );
require_once ( JPATH_BASE .DS.'includes'.DS.'defines.php' );
require_once ( JPATH_BASE .DS.'includes'.DS.'framework.php' );
$mainframe =& JFactory::getApplication('site');
$mainframe->initialise();
//optional use depend on requirement
jimport( 'joomla.user.user');
jimport( 'joomla.session.session');
jimport( 'joomla.user.authentication');
Ответ 6
чтобы получить идентификатор пользователя, вам нужно использовать функции Joomlas:
$user =& JFactory::getUser();
$user->get('id');
позволит вам получить идентификатор пользователя. вам, однако, нужно будет сделать это на странице Joomla, чтобы я не знал, как использовать для вас шляпу usefult.
Ответ 7
примените это в mod_login.php
После того, как:
$user =& JFactory::getUser();
echo "<p>Your usertype is {$user->usertype} which has a group id of {$user->gid}.</p>";
Ответ 8
Очень возможно, что, подобно Wordpress, Joomla не использует никаких данных сеанса, а скорее извлекает данные непосредственно из базы данных. В этом случае вам нужно будет использовать собственные функции Joomla.
Но это только из моего опыта работы с Wordpress.
Обновление
Думаю, я ошибся.
По-видимому, это класс api для доступа к переменным сессии Joomla:
//Возвращает ссылку на глобальную JSession, только создавая его, если он еще не существует $session = & Амп; JFactory:: getSession();
//Получить значение из сеанса var $value = $session- > get ('var_name', нуль);
//Поместите значение в сеанс var $session- > set ('var_name', $value);
Ответ 9
Возможно, было бы полезно посмотреть, как это достигается в мостах приложений, таких как jFusion. Я предлагаю хотя бы системный плагин для Joomla, который будет использовать функции joomla, чтобы получить все, что вам нужно, от установки joomla и shipto вашего приложения onApplicationInitialize. Важнейшей проблемой будет моделирование потока данных ur!
Ответ 10
Чтобы использовать идентификатор пользователя Joomla:
$user =& JFactory::getUser();
$user_id = $user->get('id');
и использовать идентификатор сеанса пользователя:
$session = & JFactory::getSession();
$session_id = $session->getId();
Ответ 11
Если вы сохраняете свои сеансы в базе данных, вы можете декодировать данные сеанса, как в этом комментарии:
http://www.php.net/manual/en/function.session-decode.php#79244
Ответ 12
Я предполагаю, что по заявлению вы имеете в виду другой веб-сайт. Лучше всего иметь iframe в этом приложении, создавая экземпляр файла запуска Joomla, получить идентификатор пользователя в этом iframe, хранить его где-то в базе данных вместе с вашим текущим идентификатором сеанса, а затем извлекать его другим приложением. Это займет некоторое время.
Ответ 13
Я поставил ниже код в Joomla index.php, и он отлично работает для меня.
//Set session to access it outside
$user =& JFactory::getUser();
$username = $user->get('username');
session_start();
$_SESSION['username'] = $username;
Теперь вы можете использовать переменную сеанса вне Joomla, как показано ниже
session_start();
$_SESSION['username'];
Ответ 14
Я не могу сказать вам, как Joomla с версиями выше 1.5 делает это, но в Joomla 1.5 вот как вы это делаете: (Я уверен, что для других версий процедура очень аналогичный)
Joomla генерирует уникальный идентификатор сеанса для интерфейса и веб-сайта.
Для доступа к данным сеанса все, что вам нужно, это знать идентификатор сеанса.
В файле конфигурации joomla есть параметр, называемый секрет "
В качестве исходного кода вы создаете идентификатор сеанса:
$session_id = md5( md5( JConfig::$secret.'administrator' ) );
и для переднего конца:
$session_id = md5( md5( JConfig::$secret.'site' ) );
После этого простой запрос
mysql_query( 'SELECT `data` FROM jos_session WHERE session_id="'.$sessionId.'" )
предоставит вам доступ к данным сеанса. Все, что вам нужно, это расшифровать его с помощью
session_decode
и данные сеанса будут в переменной $_ SESSION.
Не забудьте поставить session_start перед session_decode в противном случае он не будет работать