单点登录与Joomla和Flash

时间:2009-10-15 16:53:07

标签: flash authentication joomla single-sign-on blazeds

我有一个Joomla网站和一个Flash应用程序(在Flex中,如果重要的话)。 Flash应用程序使用BlazeDS作为后端。所有东西都托管在同一个服务器,同一个域中。

无论如何都要为上述环境实施SSO?

更新

我想要的是: 如果用户在Joomla登录,他们将自动登录Flash应用程序。反之亦然。

2 个答案:

答案 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 时,我使用会话已经存在。