我有一个Joomla网站和一个Flash应用程序(在Flex中,如果重要的话)。 Flash应用程序使用BlazeDS作为后端。所有东西都托管在同一个服务器,同一个域中。
无论如何都要为上述环境实施SSO?
更新
我想要的是: 如果用户在Joomla登录,他们将自动登录Flash应用程序。反之亦然。
答案 0 :(得分: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
您使用哪个,重要的是如何生成登录Joomla的URL。它看起来像:
example.com/index.php?option={com_component}&template=component&no_html=1
其中{com_component}是组件的名称。
在使用Joomla PHP Component的情况下,它看起来像:
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 App可以通过URLLoader或类似请求使用。或者只是字符串TRUE或FALSE。
更新:
哎呀,抱歉这不是我想要的。一世 想要用户登录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请求,或者您可以使用flash vars或ExternalInterface(http://livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/flash/external/ExternalInterface.html)。
更重要的部分是在Flex和浏览器之间传递会话名称和ID。您需要会话名称,以便可以在浏览器中设置会话cookie。 cookie的名称应与会话名称相同,其值应为会话ID。
您可以使用ExternalInterface通过浏览器JavaScript设置cookie。
设置cookie后,Flex和浏览器共享同一个用户会话,并显示登录的用户。
你也可以在BlazeDS和Joomla之间做同样的事情,然后让Flash与BlazeDS交谈以获取会话信息。
另一方面,如果用户通过Joomla登录,则在嵌入闪存时使用flashvars将该会话传递给Flash,或者使用ExternalInterface。
答案 1 :(得分: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 时,我使用会话已经存在。