我有一個Joomla網站和一個Flash應用程序(在Flex中,如果它很重要)。 Flash應用程序使用BlazeDS作爲後端。所有的東西都託管在同一個服務器,同一個域中。單點登錄Joomla和Flash
無論如何要爲上述環境實施SSO嗎?
更新:
我要的是: 如果用戶在登錄的Joomla中,它們會自動在Flash應用程序登錄。反之亦然。
我有一個Joomla網站和一個Flash應用程序(在Flex中,如果它很重要)。 Flash應用程序使用BlazeDS作爲後端。所有的東西都託管在同一個服務器,同一個域中。單點登錄Joomla和Flash
無論如何要爲上述環境實施SSO嗎?
更新:
我要的是: 如果用戶在登錄的Joomla中,它們會自動在Flash應用程序登錄。反之亦然。
您需要創建一個組件來處理登錄。
實際的登錄代碼非常簡單。這裏是我們爲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的。
我該怎麼做你願意爬行插件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。
對不起,我不那麼熟悉的Joomla。用戶登錄Joomla會通過請求url自動登錄到Flash?不需要傳遞用戶名/密碼? – 2009-10-29 11:21:19
您需要通過HTTP傳遞用戶名和密碼,然後將其傳遞給login()函數。例如:'$ result = login($ _ POST ['username'],$ _POST ['password']);' – bucabay 2009-11-02 08:19:58
哎呀,抱歉,這不是我想要的。我想如果用戶在Joomla上登錄,他們將在Flash應用程序中自動登錄。反之亦然。 – 2009-11-04 14:12:43