此内容适合Joomla!1.5版本

2009.11.23日,直接将演示站点全站打包供下载。请点击此处下载文件包请点击此处下载数据库包。注意,无需对数据库进行任何改动。关于文件,只需比照本文查看某日期后改动的文件即可。

2009.07.19晚再次修订,现在本文结尾处所声称的点已经全部实现。下载文件均已更新,对plugins/authentication/joomla.php文件的更改有所添加。请详读内文。

2009.07.18/19更新,修正在附件不能下载的问题,架设了测试网站。因为测试站点使用J1.5.12,因此,所有附件均有变更。请重新下载所有附件。
测试站点在:http://j15ucenter.treeber.net/

注意:本措施可能仍不适合有大量数据的生产环境用户,最好ucenter与joomla两表中的用户用户名不冲突。若有冲突,可自行想办法解决,或确定两个用户用户名email都一致。若用于生产环境,请仔细测试并自行负责。

感谢jet,感谢Jianer和动漫CG同学,我已经修正了代码中的单引号问题和大量其他问题。另外,若有整合不成功者,可以在本文下贴出网址或直接加我QQ2717438或在群里讨论,我将提供协助,以首先让其中几个正常运转。而后,望大家帮助大家。

1. 安装ucenter(请下载最新版本)及discuz(6.1for ucenter版本及以上,7.0版本亦可),遵照康盛创想官方说明,若对此步骤有所疑问,有两个joomla的QQ群内的热心网友应该可提供免费指导:27974098及44088499;
此步骤请注意,请确保复制了一个uc_client的文件夹到joomla安装根目录,这是ucenter的客户端程序库(感谢freeman提醒)。

2. 说明:若已经安装discuz,则请安装ucenter并照安装步骤提示整合discuz;

3. 在joomla安装根目录下放置文件configuration_uc.php,文件内容如下(按照文件中的注释修改数据库名及密码等配置参数,其中省略号的项目必须调整,其他项目据情况调整):

<?php
define('UC_CONNECT', 'mysql'); // 连接 UCenter 的方式
define('UC_DBHOST', 'localhost'); // UCenter 数据库主机
define('UC_DBUSER', 'dbuser'); // UCenter 数据库用户名
define('UC_DBPW', 'password'); // UCenter 数据库密码
define('UC_DBNAME', 'dname'); // UCenter 数据库名称
define('UC_DBCHARSET', 'utf8'); // UCenter 数据库字符集
define('UC_DBTABLEPRE', 'dbname.uc_'); // UCenter 数据表前缀
define('UC_DBCONNECT', '0'); // UCenter 数据库持久连接
define('UC_KEY', 'dfjsalkfjslakj32142080dasllkj'); // 与 UCenter 的通信密钥
define('UC_API', 'http://j15ucenter.treeber.net/ucenter'); // UCenter URL
define('UC_CHARSET', 'utf-8'); // UCenter 的字符集
define('UC_IP', '124.254.31.111'); // UCenter 的 IP
define('UC_APPID', 2); // 当前应用的 ID,根据后台添加的joomla应用不同而不同
?>

4. 在joomla安装根目录下创建api文件夹,放置如下两个文件(可直接将下面文件解压至joomla安装根目录):

点此下载api_rev2.zip

如何在ucenter中添加一个应用与joomla连通?

注意,请在ucenter控制后台添加一个应用,自定义参数,名字为joomla,应用的url填类似这样的
http://j15ucenter.treeber.net
通信密钥就是咱们在configuration_uc.php中设置的那一长串,这儿咱们设的是
dfjsalkfjslakj32142080dasllkj
应用类型选
其他
是否开启同步登录选

是否接受通知选

现在,在ucenter的应用中看能不能顺利连到joomla了?

5. 说明:如上两步使ucenter对joomla系统发送的登录、注销、注册、更名、改密等消息能被本系统接收;

6. 现在进入关键步骤,我们将使joomla中的登录、注销、注册等事件发送至ucenter中;
请在joomla后台管理界面的插件安装中,安装插件(自动化程序)plugins,并在插件管理界面中启用它,安装包如下:

点此下载plu_joomlaucenter.zip

8. 请修改如下两个joomla文件,注意修改前请备份文件为joomla.orig.php和controller.orig.php

针对 /plugins/authentication/joomla.php

约86/88行,将
$testcrypt = JUserHelper::getCryptedPassword($credentials['password'], $salt);
改为
if($options['checkpassword']=='skip')
$testcrypt = $crypt;
else
$testcrypt = JUserHelper::getCryptedPassword($credentials['password'], $salt);

同样是此文件,在开始处
jimport( 'joomla.plugin.plugin' );
后面添加

//added by afo...
include_once(JPATH_ROOT.DS."configuration_uc.php");
include_once(JPATH_ROOT.DS."uc_client".DS."client.php");
include_once(JPATH_ROOT.DS."api".DS."func_joomla_cb_user.inc.php");
//added by afo...end

针对 /components/user/controller.php
请记住这两个位置

在约138行(在Joomla! 1.5.12中是第148行)

// Redirect if the return url is not registration or login
if ( ! $return ) {
$return = 'index.php?option=com_user';
}

$mainframe->redirect( $return );

还有约175行(在1.5.12中是约185行)

// Redirect if the return url is not registration or login
if ( $return && !( strpos( $return, 'com_user' )) ) {
$mainframe->redirect( $return );
}

修改:

138/148行的改为:

// Redirect if the return url is not registration or login
if ( ! $return ) {
$return = 'index.php?option=com_user';
}

//added by afo...
exit('<script language="javascript">window.alert("login success");window.location.href="'.$return.'";</script>');

$mainframe->redirect( $return );

请注意:175/185行的改为:

exit('<script language="javascript">window.alert("logout success");window.location.href="'.$return.'";</script>');
// Redirect if the return url is not registration or login
if ( $return && !( strpos( $return, 'com_user' )) ) {
$mainframe->redirect( $return );
}

注意,本步骤中,必须修改核心文件。

7. 按如下措施检查登录:

从discuz中登录后进入joomla看系统是否登录;

从joomla中登录后进入discuz看系统是否登录;

分别从两个系统登录,在discuz中注销看系统是否完全注销;

分别从两个系统登录,在joomla中注销后看系统是否完全注销。

其他改密、改名等也均请测试。

8.已知实现和问题:

·可由joomla中注册,ucenter其他应用中(以下简称ucenter)中将同步添加

·可由joomla中登录退出,ucenter将同步登录退出;

·可由joomla中修改/重置密码,ucenter可有新密码;

·可由DZ或其他ucenter应用中(以下简称DZ)注册,登录后joomla中将同时有新用户(不论在何处登录);

·可由DZ登录退了,Joomla将同步登录退出;

·可在DZ/Ucenter中改密码,Joomla将同步更改密码

·可在Joomla中删除和修改用户资料,Ucenter将同步删除或更改资料(Email)

--已知若在DZ中注册后,没有再次登录,则Joomla中若注册同名用户系统会给出提示,但界面过于简单

--已经Ucenter中删除用户后不会通知Joomla,而程序中当时暂无判断Joomla中用户是否被删除

--若在joomla后台设置需要验证,则用户登录时仍然提示成功,实际上未登录,这似乎是1.5.12的bug

--在退出后DZ有时会显示用户仍然在状态,但可能会提示用户“您没有登录”,或者点击后才消除登录状态

为了规避问题,建议如下:

^最好只开启某一个应用的注册链接

^建议Joomla不需用户验证,DZ需要用户验证或采用验证码

^仅在Joomla中删除用户

^需要更多针对DZ的测试和设置


另外,请先检查一下Phpinfo中output_buffering的值,不要设置为off

我需要更多反馈。请大家试用测试站点。