计划给ElecSpark站群弄个单点登录,并整合用户信息和积分系统,遂开始研究Ucenter开发。
1
首先使用了官方的uc_client例程,部署到服务器上,作为现在ucenter server的一个app(此后称作sso-app),可以实现注册、登录、登出。
问题来了,在sso-app中注册的账号,必须在其他app中激活一次才能登录其他app,这个过程实际上就是app从ucenter读取用户数据,再写入自身数据库。
要想完成真正的单点登录,那就要在sso-app向ucenter写入用户数据的同时,向其他app写入数据。
这个写入过程在 uc_client\model\user.php 的 add_user 函数中
function add_user($username, $password, $email, $uid = 0, $questionid = '', $answer = '', $regip = '') { $regip = empty($regip) ? $this->base->onlineip : $regip; $salt = substr(uniqid(rand()), -6); $password = md5(md5($password).$salt); $sqladd = $uid ? "uid='".intval($uid)."'," : ''; $sqladd .= $questionid > 0 ? " secques='".$this->quescrypt($questionid, $answer)."'," : " secques='',"; $this->db->query("INSERT INTO ".UC_DBTABLEPRE."members SET $sqladd username='$username', password='$password', email='$email', regip='$regip', regdate='".$this->base->time."', salt='$salt'"); $uid = $this->db->insert_id(); $this->db->query("INSERT INTO ".UC_DBTABLEPRE."memberfields SET uid='$uid'"); return $uid; }
2
理论上只要在这个函数中 向其他app数据库写入用户信息就可以实现我要的效果。
但具体写哪几个表,我还不清楚,只能研究下discuz中注册时怎么写入数据库。
discuz写入数据库的操作在 source\module\member\member_register.php中:
if(!defined('IN_DISCUZ')) { exit('Access Denied'); } define('NOROBOT', TRUE); $ctl_obj = new register_ctl(); $ctl_obj->setting = $_G['setting']; $ctl_obj->template = 'member/register'; $ctl_obj->on_register();
主要就是用到了register_ctl这个类,遂又在source\class\class_member.php 中找到这个类,而注册函数为on_register()。
给跪了,这函数写的太尼玛长了。
搜索discuz用户表表明common_member,发现写入用户数据的操作,大概在780+行。
再搜索insert,发现程序应该向以下表都写入了文件:
common_regip
common_member
common_member_verify
common_member_verify_info
common_member_validate
【疑问:当QQ登录时,怎么写数据库,或者说怎么关联到现在的用户,这个待研究】
3
然后分别查这几个表的用处:
common_regip 限制注册IP的,这个基本可以忽视了
common_member是用户主表,这个不用说啥,必须写的
common_member_verify、common_member_verify_info、common_member_validate都是用于认证和审核的,貌似是不用管的。
难道说只用写common_member就行了?理论上应该有个函数用来初始化其他表吧,于是我决定把discuz的common_member_下的表都看一遍,验证下我的想法。
common_member_count 用于统计信息的,例如发了几个贴、几个精华、积分多少,这个确实每个用户都有一行;
common_member_field_forum 用于存用户一些信息的,也是每个用户都有一个(行)XXXX;
common_member_field_home 用户家园字段表,类似QQ空间的玩意,理论上应该不写也行,但既然每个用户都行,那还是新用户把默认数据初始化一次最好;
common_member_profile 用户详细信息,这个要做个初始化才行
common_member_status用户状态与数据统计表,也许大概有可能要做初始化
这样来看,就要写入这5个表
当然discuz是这样,其他的app还得对应修改。
没学过php的情况,能分析到这步已经很是不错了,明天继续。
参考资料:
http://faq.comsenz.com/library/?from=discuzheader
http://discuzt.cr180.com
http://my.oschina.net/u/1053317/blog/136041
http://www.nowamagic.net/librarys/veda/detail/1497
http://www.oicto.com/tag/ucenter/
http://www.ngro.org/tech/ucenter-synclogin-activation.html