Доступ к данным сеанса за пределами 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();

Ответ 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 в противном случае он не будет работать