知识共享平台(JAVA)/UCenter/WeCenter 用户数据对接与单点登录

一、用户数据对接原则(项目组制定):

以知识共享平台为主数据源,同步到UCenter与WeCenter上,如图:


知识共享平台(JAVA)/UCenter/WeCenter 用户数据对接与单点登录_第1张图片


二、数据对接用户操作序列:

待补充





三、数据对接相关数据表


   Ucenter相关表
uc_members (用户数据,包括id,用户名、邮箱等必要数据)
uc_memberfields(暂时没发现用处)

   WeCenter相关表
aws_users_ucenter (存储从UCenter同步得到的数据)
aws_users  (本地用户数据)


四、代码分析

  • 用户同步校验
        当需要用户在java平台进行单点登录或新用户注册时,需要先用Clinet的uc_user_login方法进行登录检查,返回结果包括:1检查成功(用户存在且密码正确)、-1用户不存在或者被删除;-2 密码错误。

  • 用户注册
        根据校验结果,java平台需要选择用户注册(如果成功,跳过此步骤),调用uc_user_register 方法进行用户注册。

  • 用户登录
        注册成功或者校验用户存在后,可以进行用户登录。但此时包括两种情况:1)WeCenter中存在该用户,2)WeCenter不存在该用户。出现两种情况的原因是:注册用户后,UCenter无法完成WeCenter中的用户注册(根据整体项目技术方案,不对注册情况进行修改,而是在用户登录时,WeCenter中无记录,则插入并登录)。

        根据技术方案,需要对WeCenter侧 的插件进行修改,见下面“uc.php代码修改”,保证在UCenter向WeCenter校验用户时,WeCenter本地不存在则插入一条记录。
想起什么再补充。


五、uc.php代码修改

  • uc.php中修改   function synlogin($get, $post):
		if ($uc_info = $this->db->fetchRow("SELECT * FROM {$this->tablepre}users_ucenter WHERE uc_uid = " . $uid))
		{
			if ($user_info = $this->db->fetchRow("SELECT * FROM {$this->tablepre}users WHERE uid = " . $uc_info['uid']))
			{
				HTTP::set_cookie('_user_login', get_login_cookie_hash($user_info['user_name'], $user_info['password'], $user_info['salt'], $user_info['uid'], false), $cookietime);
			}
		}
之后添加else处理如下:

		if ($uc_info = $this->db->fetchRow("SELECT * FROM {$this->tablepre}users_ucenter WHERE uc_uid = " . $uid))
		{
			if ($user_info = $this->db->fetchRow("SELECT * FROM {$this->tablepre}users WHERE uid = " . $uc_info['uid']))
			{
				HTTP::set_cookie('_user_login', get_login_cookie_hash($user_info['user_name'], $user_info['password'], $user_info['salt'], $user_info['uid'], false), $cookietime);
			}
		} else {// 针对知识共享改造
			//echo AWS_APP::model("ucenter");
			$username = $get['username'];
			preg_match("/\\[(.*)\\]/i", $username, $matches);
			$email =  $matches[1];  // 获取邮箱
			$salt = fetch_salt(4);  // 获取盐值
			$passwd = compile_password($get['password'], $salt);
			//echo $get['password'];
			
		
			$this->db->query("INSERT INTO {$this->tablepre}users (user_name, email, password, sex, group_id, salt, reg_time) VALUES ('$username', '$email', '$passwd', 0, 3, '$salt', UNIX_TIMESTAMP(now()))");
			$we_user = $this->db->fetchRow("SELECT * FROM {$this->tablepre}users WHERE user_name = "."'$username'");
			//echo "user:".$we_user['uid'];
			
			$this->db->query("INSERT INTO {$this->tablepre}users_ucenter (uid,uc_uid, username, email) VALUES ({$we_user['uid']},$uid, '$username', '$email')");
			
			//echo "passed:".$we_user['password'];
			//echo "passed:".$we_user['user_name'];
			//echo "passed:".$we_user['salt'];
			//echo "passed:".$we_user['uid'];
			
			
			
			HTTP::set_cookie('_user_login', get_login_cookie_hash($we_user['user_name'], $we_user['password'], $we_user['salt'], $we_user['uid'], false), $cookietime);
			//$result = uc_user_login($username, $get['password'], 0);
			//echo uc_user_register($username, $passwd, $email);
			//HTTP::set_cookie('_user_login', get_login_cookie_hash($username, $get['password'], $salt, $uid, false), $cookietime);
			//list($uc_uid, $username, $password, $email) = uc_user_login($username, $passwd, $email);
			
			//echo "result:".$result;
			
			//foreach ($result as $key=>$value) {
				//echo "%%%%".$key;
		//	echo "####".$value;
		//	}
						
		}

原有插件的代码,在Java平台发送同步请求后,如果WeCenter不存在该用户,不提供向WeCenter添加用户的功能。
在WeCenter插入用户数据时,需要对两个表进行插入操作:aws_users_ucenter 和 aws_users

六、其他源码修改

     知识共享平台的用户名为邮箱,而UCenter、WeCenter的用户名在check时,禁止超过15个字符,所以需要进行修改必要的代码,将闲置扩到255个字符,如下:

1)用户名长度不能超过15个字符  == > 不能超过255个字符

     UCenter目录中的 /model/user.php, 修改函数 check_username中判断条件:
if ($len > 15 || $len < 3 || preg_match("/\s+|^s+|^c:\\con\\con|。。。))  ==>      if ($len > 255 || $len < 3 || preg_match("/\s+|^s+|^c:\\con\\con|。。。))

     修改UCenter数据库中username选项的类型 char(15) == > varchar(255);

2) 修改WeCenter中插件 uc_client
 model/user.php  :用户名长度不能超过15个字符  == > 不能超过255个字符,位置同上。

3)同步时,密码的问题
      在继续对用户登录进行同步时,发现Java平台的密码为加密后的32字符串,同步时总是验证密码错误(返回-2),根据测试,只要不为32为的密码都可以校验通过,读取插件(我可是Java程序猿啊~~~)的代码,发现发送请求前,插件对参数采用盐值(随机数)+MD5+db64进行加密,可能跟这个有关吧,不管了,在传递参数时,对密码统一 +“1” 处理,变成32位。


4)其他问题
java插件采用的是php写法,想想也是醉了。



你可能感兴趣的:(知享平台,PHP)