Доступ к данным сеанса за пределами Joomla

Я пытаюсь запустить приложение за пределами Joomla (а не как плагин), и я хотел бы получить доступ к зарегистрированной информации пользователя (userid). Мне интересно, как мне это сделать? Есть ли файл, который я могу включить? Я попытался использовать $ _SESSION, но он показывает пустой.

Есть ли простое решение моей проблемы? Спасибо за ваше время.

На самом деле это не так просто, как кажется. 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'); 

Вышеупомянутый основной скрипт, необходимый для доступа к ресурсам Joomla.

  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'; } 

Решение состоит в том, чтобы установить сеанс для всего домена и / или сайта. Это применяется, если вы пытаетесь получить доступ к данным сеанса вне области joomla. Например, если ваш сайт joomla находится на http://example.com/joomla/ и на вашем другом сайте на http://othersite.example.com/, то cookie, содержащий идентификатор сеанса, не передается от joomla к другому сайт. Чтобы изменить это поведение, используйте параметры session_ set_ cookie_ перед каждым 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/ .

Это должно решить вашу проблему, если вы не пытаетесь получить доступ к данным сеанса из другого домена. Если это так, оставьте здесь комментарий, я посмотрю, найду ли я что-нибудь.

Решение, показанное Стефаном Геригом

 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 был вызван.

Спасибо за решение.

Прежде всего, вы должны предоставить определение некоторым константам (идентификаторам) 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'); 

для получения идентификатора пользователя вам необходимо использовать функции Joomlas:

$user =& JFactory::getUser();
$user->get('id');

позволит вам получить идентификатор пользователя. вам, однако, нужно будет сделать это на странице joomla, чтобы я не знал, как использовать шляпу usefult для вас.

примените это в mod_login.php

После: $user =& JFactory::getUser();

echo "<p>Your usertype is {$user->usertype} which has a group id of {$user->gid}.</p>";

Очень возможно, что, подобно WordPress, Joomla не использует никаких данных сеанса, а скорее извлекает данные непосредственно из базы данных. В этом случае вам понадобятся собственные функции Joomla.

Но это только из моего опыта работы с WordPress.

обновленный

Наверное, я ошибся.
По-видимому, это класс api для доступа к переменным сессии Joomla:

// Возвращает ссылку на глобальный объект JSession, только создавая его, если он еще не существует. $ Session = & JFactory :: getSession ();

// Получить значение из сеанса var $ value = $ session-> get ('var_name', null);

// Поместите значение в сеанс var $ session-> set ('var_name', $ value);

Возможно, было бы полезно посмотреть, как это достигается в мостах приложений, таких как jFusion. Я предлагаю хотя бы системный плагин для Joomla, который будет использовать функции joomla, чтобы получить все, что вам нужно, от установки joomla и shipto вашего приложения onApplicationInitialize. Важнейшей проблемой будет моделирование потока данных в формате ur!

Чтобы использовать идентификатор пользователя Joomla:

 $user =& JFactory::getUser(); $user_id = $user->get('id'); 

и для использования идентификатора сеанса пользователя:

 $session = & JFactory::getSession(); $session_id = $session->getId(); 

Если вы храните свои сессии в базе данных, вы можете декодировать данные сеанса, как в этом комментарии:

http://www.php.net/manual/en/function.session-decode.php#79244

Я предполагаю, что по заявлению вы имеете в виду другой веб-сайт. Лучше всего иметь iframe в этом приложении, создавая экземпляр файла запуска Joomla, получить идентификатор пользователя в этом iframe, хранить его где-то в базе данных вместе с вашим текущим идентификатором сеанса, а затем извлекать его другим приложением. Однако потребуется некоторое время.

Я поставил ниже код в 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'];

Я не могу сказать вам, как 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, иначе он не будет работать