基于Ucenter的单点登录系统开发过程(一)

1477

计划给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

留下一个答复

Please enter your comment!
Please enter your name here