2009-10-15 112 views
3

我有一個Joomla網站和一個Flash應用程序(在Flex中,如果它很重要)。 Flash應用程序使用BlazeDS作爲後端。所有的東西都託管在同一個服務器,同一個域中。單點登錄Joomla和Flash

無論如何要爲上述環境實施SSO嗎?

更新:

我要的是: 如果用戶在登錄的Joomla中,它們會自動在Flash應用程序登錄。反之亦然。

回答

2

您需要創建一個組件來處理登錄。

實際的登錄代碼非常簡單。這裏是我們爲Joomla1.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是你的PHP組件創建頁面菜單ITEMID。它是在爲PHP頁面創建PHP組件的菜單項後生成的。

& template = component & no_html = 1確保只加載HTML組件,no_html表示不加載任何HTML聲明。

因此,您可以擁有一些代碼,例如返回JSON或XML響應,以便Flex應用程序可以通過URLLoader或類似請求使用該代碼。或者只是字符串TRUE或FALSE。

更新:

哎呀,對不起,這不是要我要。 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向Joomla發送HTTP請求,或者您可以使用閃存變量或ExternalInterface(http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html)。

更重要的部分是通過你的會話名稱和ID Flex和瀏覽器之間。您需要會話名稱,以便您可以在瀏覽器中設置會話Cookie。該cookie應該與會話名稱相同,並且它的值應該是會話ID。

您可以使用ExternalInterface的設置與瀏覽器的JavaScript的餅乾。

一旦設置cookie,Flex和瀏覽器都共享相同的用戶會話,並會顯示登錄的用戶。

你也可以做的BlazeDS和Joomla之間同樣的事情,然後讓Flash交談BlazeDS獲取會話信息。

在另一端,如果用戶通過登錄的Joomla中,你再傳遞會話時您嵌入閃存使用Flash變量來閃光燈,或使用ExternalInterface的。

+0

對不起,我不那麼熟悉的Joomla。用戶登錄Joomla會通過請求url自動登錄到Flash?不需要傳遞用戶名/密碼? – 2009-10-29 11:21:19

+0

您需要通過HTTP傳遞用戶名和密碼,然後將其傳遞給login()函數。例如:'$ result = login($ _ POST ['username'],$ _POST ['password']);' – bucabay 2009-11-02 08:19:58

+0

哎呀,抱歉,這不是我想要的。我想如果用戶在Joomla上登錄,他們將在Flash應用程序中自動登錄。反之亦然。 – 2009-11-04 14:12:43

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。

如果沒有進行此更改,flex將爲用戶創建一個新會話,強制他再次登錄,當我更改$ this - > _ name我使用已存在的會話推送flex。