2009-07-24 2 views
13

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

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

ответ

19

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

+0

Я хотел бы задействовать эту функциональность в CakePHP. Сайт на основе пирога размещен на субдомене. Как вы думаете, ваш совет будет применяться к моей проблеме? – the0ther

+0

Я не знаю CakePHP и его механизмов аутентификации, но я думаю, что этот подход мог бы работать в целом - до тех пор, пока вы сможете передать идентификатор (куки-файл в моем случае) из приложения 1 в приложение 2. Учитывая, что поддомен он должен не проблема иметь cookie, который может быть прочитан как из субдомена, так и из основного домена. –

+0

Извините за вопрос noob, но я предполагаю, что мы помещаем это в PHP-скрипт в базовый каталог Joomla? – Jaryl

4

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

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

0

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

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

Обновлено

Я предполагаю, что я был неправ.
Supposidly это класс API для доступа к переменным Joomla Session:

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

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

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

1

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

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

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

+0

Это то, что я сделал. Я не мог решить, какую минимальную среду мне нужно настроить, чтобы получить доступ к функциям Joomla, поэтому я просто запустил пулю и научился писать компоненты. Они немного странные, но не так уж плохи, как только вы получите это. По крайней мере, вы можете получить все, что захотите, через API Joomla. – nedned

0

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

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

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

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

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

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

Раствор показал на Стефан Герига

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

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

1

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

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

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

0

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

0

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

2

Прежде всего вы должны обеспечить определение для констант некоторых 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'); 

Таким образом, ядро ​​co де для вашего файла выглядит следующим образом:

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'); 
0

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

Смежные вопросы