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

Как насчет этого?

SELECT 
    (CASE WHEN @date <> date THEN @row := @row +1 ELSE @row END) AS rownum, 
    @date:= date, 
    date
FROM ( SELECT @row := 0, @date := NOW() ) r, stats
13
задан Alec Smart 24 July 2009 в 03:20
поделиться

9 ответов

На самом деле это не так просто, как это звучит. 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.

Мы сделали это, добавив адаптер 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.

Мы сделали это, добавив адаптер 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.

Там мы читаем зашифрованный файл 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.

Там мы читаем зашифрованный 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.

19
ответ дан 1 December 2019 в 19:15
поделиться

Решение состоит в том, чтобы установить сеанс для всего домена и / или сайта. Это применимо, если вы пытаетесь получить доступ к данным сеанса за пределами области действия 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
ответ дан 1 December 2019 в 19:15
поделиться

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

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

Обновлено

Думаю, я ошибался.
Предположительно, это класс api для доступа к переменным сеанса Joomla:

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

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

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

0
ответ дан 1 December 2019 в 19:15
поделиться

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

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

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

1
ответ дан 1 December 2019 в 19:15
поделиться

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

0
ответ дан 1 December 2019 в 19:15
поделиться
 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';
    }
8
ответ дан 1 December 2019 в 19:15
поделиться

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

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

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

$session = & JFactory::getSession();
$session_id = $session->getId();
0
ответ дан 1 December 2019 в 19:15
поделиться

Решение, предложенное Стефаном Геригом

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 .

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

2
ответ дан 1 December 2019 в 19:15
поделиться

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

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

0
ответ дан 1 December 2019 в 19:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: