立即注册 登录
彼岸网 返回首页

ludi99的个人空间 http://www.bian-wang.com/discuz/?10364 [收藏] [复制] [分享] [RSS]

日志

思考如何让Discuz支持多个UCenter数据库

热度 2已有 346 次阅读2016-10-29 02:55 PM |系统分类:社交网理论与实践

日前和天香谈及扩展UCenter的数据库环境的问题。还只是一个初步的设想,是否可行,怎么做,都还没有头绪。这里开个头,把搜集到的信息先罗列出来,慢慢再整理,消化。

(1) Discuz登录功能原理分析
      http://www.phpstudio.info/show-148-1262-1.html

(2) 登录同步用户数据
      http://www.cnblogs.com/ymind/p/4174281.html
 改进方法的设想:
      在 /api/uc.php 中,找到函数 function synlogin()
       
原代码为
if(($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}

将其增改为如下伪代码:
if(($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
} else {
   // ------- 如下四行功能的伪代码有待实现 -------------
    // check if user account exists
    // If not, call function to load user from the second UCenter
    // Recursively load user from another UCenter if the current UCenter contains no such user record.
    // If no record is found, return a false record

    // If the user is found, do following:
    if($user) {
        $time = time();
        DB::query("REPLACE INTO ".DB::table('common_member')." SET `uid`='{$user[0]}' , `username`='{$user[1]}' , `password`='".md5(random(10))."' , `email`='{$user[2]}' , `adminid`='0' , `groupid`='10' , `regdate`='{$time}' , `emailstatus`='0' , `credits`='0' , `timeoffset`='9999'");
        DB::query("REPLACE INTO ".DB::table('common_member_status')." SET `uid`='{$user[0]}' , `regip`='{$_G['clientip']}' , `lastip`='{$_G['clientip']}' , `lastvisit`='{$time}' , `lastactivity`='' , `lastpost`='0' , `lastsendmail`='0'");
        DB::query("REPLACE INTO ".DB::table('common_member_count')." SET `uid`='{$user[0]}' , `extcredits1`='0' , `extcredits2`='0' , `extcredits3`='0' , `extcredits4`='0' , `extcredits5`='0' , `extcredits6`='0' , `extcredits7`='0' , `extcredits8`='0'");
        DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'");
        DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'");
        DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'");
        DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime` = '".date('Ymd', $time)."'");
        if(($member = getuserbyuid($uid, 1))) {
            dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
        }
    }
}
(以上代码是抄来的,可惜从我的笔记上一时找不到原始出处。待查到后再行补上。)
----------------------
延续探讨

天香:
需要解决的问题

一、鉴别用户所在的UCenter数据库。

方法之一。当生成 uid 号码时预设一个初始值。(如第一个UCenter里初始值设为1,第二个UCenter里初始值设为一百万)。

方法之二。在Discuz数据库里人为区分(实时后续处理):假定你用的UCenter的数目不到十的话,那就在这些UCenter给的uid前加一位数。例如第一个UCenter里uid是3的用户可以看成在Discuz里的uid是13,而第二个Ucenter里uid是3的用户可以看成在Discuz里的uid是23。

第二种方法的好处。在于这样做的话只要改Discuz网站里的uc_client/client.php和api/uc.php这两个文件就够了,在其中加上两种uid之间的转换。

二、是否允许不同的UCenter存在同样用户名。

(1) 用户登录时也许要让他们选择UCenter
(2) 页面上显示用户名的地方也许要加上不同UCenter的标志。解决方法:最好是要求这些UCenter不能有同样的用户名。

三、 多个外部应用共享多个UCenter
每个UCenter都得带着各自的uc_client。每个UCenter都将其它所有的UCenter加在它的外部应用列表里,这样它们才能互相联系。当一个UCenter要查询某用户名是否存在于另一个UCenter时,就调用对方的uc_client里client.php的函数uc_user_checkname就行了

发表评论 评论 (12 个评论)

回复 天香公主 2016-11-2 01:39 PM
ludi99: 我得再消化一下“应用”的概念。尤其对UCenter里的“应用列表”的作用和管理方式,请天香做些讲解.

是否可以这样提问,为什么UCenter里需要记录应用呢?从用户 ...
UCenter需要知道各个应用网站的一些信息,如网站地址和共用的密钥,这样应用网站和UCenter网站才能互相联系。需要知道共用的密钥才能在通讯时发的一方将内容加密,接受方再将内容解密。需要知道应用的地址是因为不仅应用网站有联系UCenter网站的需要比如要验证用户登录时给的用户名和密码是否正确,UCenter网站也有和应用网站联系的必要(确切的说是知道应用网站网址的必要)比如用户在一个应用里登录后要通知其它支持同步登录的应用网站让他同时自动登录。

Discuz的安装程序将网站作为UCenter的应用所要做的步骤都自动完成了,所以也许你没注意。进UCenter里看看就知道都自动设好了。
回复 ludi99 2016-11-2 11:46 AM
天香公主: 我前面提出的解决方案(第一段)是针对多个新系统的情形。如果是解决多个现有的用户数据库系统,这样做需要改动数据(如改动所有的Discuz数表里的uid),虽然可 ...
突破单一UCenter的限制是我的初衷。多个网站的协作运行或许是个延伸的红利。但即便在同一站点里都可以容纳无数的数据库。如今就连白菜价的起步Hosting服务都白送好几百个MySQL数据库。不由地感到限于一个数据库的UCenter方式显得老旧,像个瓶颈。

既然花时间了,所以我想不如搞点带有突破性的东西。
回复 ludi99 2016-11-2 11:32 AM
天香公主: 对,是指这样的应用,与插件无关。

第二段是说如何确保几个UCenter里没有同样的用户名吧?要做到这点,我觉得这些UCenter都得互相成为对方的应用,但是它们可以 ...
我得再消化一下“应用”的概念。尤其对UCenter里的“应用列表”的作用和管理方式,请天香做些讲解.

是否可以这样提问,为什么UCenter里需要记录应用呢?从用户管理来说,似乎并不需要知道用户在哪个应用上操作。只要确认用户是否注册并登录过。这是我有点卡壳的地方。
回复 天香公主 2016-11-2 06:50 AM
我前面提出的解决方案(第一段)是针对多个新系统的情形。如果是解决多个现有的用户数据库系统,这样做需要改动数据(如改动所有的Discuz数表里的uid),虽然可行但不实用。替换办法是不改数据,但改数据库结构,或者需要添加一个新数表,或者在现有数表里加个新表列,总之需要有种办法区分不同网站的用户
回复 天香公主 2016-11-1 10:03 AM
ludi99: 这里的“应用”是指外部应用吧?像东风博说的品牌空间,有独立的数据库。仅仅和Discuz论坛分享UCenter用户管理。换句话说,它不是插件plugin那种类型的应用。

...
对,是指这样的应用,与插件无关。

第二段是说如何确保几个UCenter里没有同样的用户名吧?要做到这点,我觉得这些UCenter都得互相成为对方的应用,但是它们可以各有各支持的应用。举例而言
UCenter1上的应用列表里有 UCenter2, App1, App2
UCenter2上的应用列表里有 UCenter1, App1, App3
回复 ludi99 2016-11-1 01:47 AM
天香公主: 上个周末看了下UCenter的代码,觉得很有意思的。

补充下第二个问题。估计每个UCenter都得带着uc_client,每个UCenter都将其它所有的UCenter加在它的应用列表里 ...
这里的“应用”是指外部应用吧?像东风博说的品牌空间,有独立的数据库。仅仅和Discuz论坛分享UCenter用户管理。换句话说,它不是插件plugin那种类型的应用。

那么它是否意味着添加应用时必须在所有的UCenter 的应用列表里同时加上新的应用?

确认下理解得对不对。
回复 ludi99 2016-11-1 01:39 AM
东风: 我是来打酱油的, 一看代码就晕,先预祝大侠们早日成功!!
说实话,我对代码更是一头雾水,只能在算法上动些脑筋。你和天香等几位做过多数据库与UCenter的对接,比较有经验。大家不用客气,想到哪里就说到哪里。
回复 ludi99 2016-11-1 12:39 AM
这篇介绍UCenter项目应用接口的文章不错,先挂出来慢慢学习。 http://www.cnblogs.com/sumsung753/p/3856239.html
回复 东风 2016-10-31 04:21 PM
我是来打酱油的, 一看代码就晕,先预祝大侠们早日成功!!
回复 天香公主 2016-10-31 01:57 PM
ludi99: 好建议!

我把你的想法加到了博文里。我特意改动了一些措词,便于考察我的理解是否和你的想法相同。如有理解错误或有更好的表达方式务请指正。

我个人倾向于第 ...
上个周末看了下UCenter的代码,觉得很有意思的。

补充下第二个问题。估计每个UCenter都得带着uc_client,每个UCenter都将其它所有的UCenter加在它的应用列表里,这样它们才能互相联系。当一个UCenter要问其它UCenter某用户名是否存在时,就调用uc_client里client.php的函数uc_user_checkname就行了。
回复 ludi99 2016-10-30 02:05 PM
天香公主: 终于明白你想要做的事了,你是要一个Discuz网站支持多个UCenter管理的用户。我觉得要在Discuz数据库里设法区分下不同UCenter里的用户uid。如果这些UCenter都是你 ...
好建议!

我把你的想法加到了博文里。我特意改动了一些措词,便于考察我的理解是否和你的想法相同。如有理解错误或有更好的表达方式务请指正。

我个人倾向于第一个问题采用种解决方案之二。第二个问题中,两个限制和条件都应该可行。对用户来说,依然是个单一的整体。

欢迎大家开动脑筋,提出评判和建议。为公益做点事情,我就不说谢谁了。
回复 天香公主 2016-10-29 08:32 PM
终于明白你想要做的事了,你是要一个Discuz网站支持多个UCenter管理的用户。我觉得要在Discuz数据库里设法区分下不同UCenter里的用户uid。如果这些UCenter都是你的话,在这些UCenter生成uid时就能设法区分,比如在members这个数表的uid表列里加个不同的初始值(如第一个UCenter里初始值设为1,第二个UCenter里初始值设为一百万)。不然的话可以在Discuz数据库里人为区分:假定你用的UCenter的数目不到十的话,那就在这些UCenter给的uid前加一位数作为Discuz数据库里用的uid。例如第一个UCenter里uid是3的用户可以看成在Discuz里的uid是13,而第二个Ucenter里uid是3的用户可以看成在Discuz里的uid是23。这样做的话只要改Discuz网站里的uc_client/client.php和api/uc.php这两个文件就够了,在其中加上两种uid之间的转换。

还有要处理下不同UCenter里可能有同样用户名的问题。在用户登录时也许要让他们选择UCenter。还有在页面上显示用户名的地方也许要加上不同UCenter的标志以示区分。如果可能的话最好是要求这些UCenter不能有同样的用户名,要改点UCenter的代码在加用户时去问下其它UCenter该用户名是否存在。

facelist doodle 涂鸦板

您需要登录后才可以评论 登录 | 立即注册

小黑屋|Archiver|彼岸网  

Powered by Discuz! X3.1 © 2001-2014 Comsenz Inc.
GMT-4, 2017-3-30 06:38 PM , Processed in 0.061345 second(s), 21 queries.

返回顶部