2009-10-15 2 views
3

У меня есть сайт Joomla и приложение для Flash (в Flex, если это имеет значение). Приложение Flash использует BlazeDS в качестве исходного кода. Все вещи размещены на одном сервере, в том же домене.Одиночный вход с Joomla и Flash

Есть ли способ реализовать SSO для вышеуказанной среды?

Update:

Что я хочу: Если пользователь вошел в систему Joomla, они будут автоматически вошли в систему в приложении Flash-памяти. То же самое и наоборот.

ответ

2

Вам нужно будет создать компонент для обработки входа.

Фактический код входа очень прост. Вот пример из компонента, который мы разработали для Joomla 1.5.

/** 
    * Log into Joomla 
    * @return Bool Login Status 
    * @param $username String 
    * @param $password String 
    */ 
    function login($username, $password, $remember = false) { 
     if ($username && $password) { 
      $mainframe =& JFactory::getApplication(); 
      return $mainframe->login(
       array('username'=>$username, 'password'=>$password), 
       array('remember'=> $remember, 'silent'=>true) 
      ); 
     } 
     return false; 
    } 

Если вы не хотите, чтобы создать полный компонент, то вы можете использовать PHP компонент с этой страницы: http://www.fijiwebdesign.com/products/joomla-php-pages.html

Который когда-либо вы используете, важно то, как генерировать URL для войдите в Joomla. Это будет выглядеть так:

example.com/index.php?option={com_component}&template=component&no_html=1 

где {com_component} - это имя вашего компонента.

В случае использования Joomla PHP компонента это будет выглядеть следующим образом:

example.com/index.php?option=com_php&Itemid={itemid}&template=component&no_html=1 

Где Itemid находится меню Itemid страницы, которую вы создаете для вашего PHP-компоненты. Он создается после создания элемента меню для компонента PHP для вашей страницы PHP.

& template = component & no_html = 1 гарантирует, что загружен только компонент HTML, а no_html означает, что он не будет загружать какое-либо объявление HTML.

Таким образом, у вас может быть код, который, например, возвращает ответ JSON или XML, который приложение Flex может использовать с помощью URLLoader или аналогичного запроса. Или просто строка TRUE, или FALSE.

Update:

Упс, извините, что не хочу, я хочу. I хотите, если пользователь вошел в систему на Joomla, , они будут автоматически зарегистрированы в Flash-приложении. То же самое и наоборот.

Я предполагаю, что вы хотите сохранить свою учетную запись пользователя в базе данных Joomla, но вы должны быть конкретными, если вы планируете хранить данные пользователя в другом месте.

Вот как проверить, если пользователь уже зарегистрирован на Joomla:

$User =& JFactory::getUser(); 
if (!$User->guest) { 
    // user is logged in 
} else { 
    // user is not logged in 
} 

Вот как получить пользователей сеанса ID:

$Session =& JFactory::getSession(); 
$sessid = $Session->getId(); 

Чтобы получить имя сеанса:

session_name(); 

Пример отправки данных пользователя и сеанса из Joomla во Flash:

$User =& JFactory::getUser(); 
$Session =& JFactory::getSession(); 
// for example use JSON which Flex undertands 
echo json_encode((object) array('user'=>$User, 'session'=>$Session, 'name'=>session_name()); 

Как вы реализуете поиск данных пользователя и сеанса, зависит от вас. Вы могли бы отправить Flash-запросы Flash в Joomla, или вы могли бы использовать flash-файлы или ExternalInterface (http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html).

Более важной частью является передача имени сессии и идентификатора между Flex и браузером. Вам нужно имя сеанса, чтобы вы могли установить cookie сеанса в браузере. Файл cookie должен быть назван так же, как имя сеанса, и его значение должно быть идентификатором сеанса.

Вы можете использовать ExternalInterface для установки cookie с помощью JavaScript браузера.

После того, как печенье установлено, как Flex и браузер используют один сеанс пользователя и покажут пользователь авторизован.

Вы также можете сделать то же самое между BlazeDS и Joomla, а затем есть флэш поговорить BlazeDS, чтобы получить информацию о сеансе.

На другом конце, если пользователь входит в систему через Joomla, вы передаете этот сеанс во Flash, используя flashvars, когда вы вставляете флеш или используете ExternalInterface.

+0

Извините, что я не очень хорошо знаком с Joomla. Является ли пользователь, вошедший в систему в Joomla, будет автоматически зарегистрирован на Flash, запросив URL? Не нужно передавать имя пользователя/pw? –

+0

Вам необходимо передать имя пользователя и пароль через HTTP, а затем передать это функции login().например: '$ result = login ($ _ POST ['username'], $ _POST ['password']);' – bucabay

+0

Ooops, извините, что я этого не хочу. Я хочу, чтобы пользователь вошел в систему на Joomla, они будут автоматически зарегистрированы в приложении Flash. То же самое и наоборот. –

1

Я должен сделать то, что вы готовы ползать плагин j-amfphp. Однако мне пришлось изменить ядро ​​плагина, так что Flex не создает новый сеанс и использует тот, который уже был создан joomla.

Для плагин, чтобы определить, какая часть была Joomla после входа (сайт или администратор), изменил файл: /joomlaapp/amfphp/includes/application.php

заменить:

parent::__construct 

по

jimport('joomla.utilities.utility'); 


if($_COOKIE["j-amfphp_admin"] == true) 
{ 
//set the view name 
$this->_name = "administrator"; 
} 
else 
{ 
//set the view name 
$this->_name = "site"; 
} 
$this->_clientId = $config['clientId']; 

//Enable sessions by default 
if(!isset($config['session'])) { 
$config['session'] = true; 
} 

//Set the session default name 
if(!isset($config['session_name'])) { 
    $config['session_name'] = $this->_name; 
} 

    //Set the default configuration file 
if(!isset($config['config_file'])) { 
$config['config_file'] = 'configuration.php'; 
} 

//create the configuration object 
$this->_createConfiguration(JPATH_CONFIGURATION.DS.$config['config_file']); 

//create the session if a session name is passed 
if($config['session'] !== false) { 
$this->_createSession(JUtility::getHash($config['session_name'])); 
} 

$this->set('requestTime', gmdate('Y-m-d H:i')); 

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

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