1. 程式人生 > >解決整合 UCenter 首次註冊同步登入與自動啟用

解決整合 UCenter 首次註冊同步登入與自動啟用

多程式整合 UCenter,在新使用者首次註冊後是沒有同步登入到其它程式的,也就是說使用者得在其它程式用密碼再登入一次,以後才能同步登入,還有就是使用者不是在 Discuz 程式註冊的話,在 Discuz 登入時得手動啟用,這些都導致使用者體驗很不好,不過解決方法很簡單~
修改各個程式目錄下的 ./uc_client/model/user.php 檔案,大概在 129 行處的 function add_user 函式裡新增程式碼
如 Discuz X 的:
$this->db->query("INSERT INTO `dbname`.pre_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_profile SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_field_forum SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_field_home SET uid='$uid'");
$this->db->query("INSERT INTO `dbname`.pre_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");

Discuz 的引數比較多,`dbname` 是資料庫名,.pre_ 是表字首,按自己的情況修改,注意需要在 MySQL 設定相應的許可權,假設 Discuz X 和 UCenter 是在不同的資料庫且不同資料庫使用者,Discuz X 資料庫和使用者是 discuz,UCenter 的資料庫和使用者是 ucenter,那麼需要設定 ucenter 擁有資料庫 discuz 的 insert 許可權。(如果是同一資料庫、同一使用者則忽略這些步驟)
phpMyAdmin 的操作步驟大概為:許可權 -> 編輯許可權 -> 按資料庫指定許可權 -> 選擇資料庫 -> 勾選 INSERT -> 執行。


這些程式碼的原理就是,在某應用註冊使用者時,同時新增其它應用的資料庫欄位,因為 UCenter 在首次註冊時並沒有這一步驟所以才沒能同步登入與啟用。

修改後完整的 function 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'");
	// BEGIN
	$this->db->query("INSERT INTO `dbname`.pre_common_member SET uid='$uid', username='$username', password='$password', email='$email', adminid='0', groupid='10', regdate='".$this->base->time."', credits='0', timeoffset='9999'");
	$this->db->query("INSERT INTO `dbname`.pre_common_member_status SET uid='$uid', regip='$regip', lastip='$regip', lastvisit='".$this->base->time."', lastactivity='".$this->base->time."', lastpost='0', lastsendmail='0'");
	$this->db->query("INSERT INTO `dbname`.pre_common_member_profile SET uid='$uid'");
	$this->db->query("INSERT INTO `dbname`.pre_common_member_field_forum SET uid='$uid'");
	$this->db->query("INSERT INTO `dbname`.pre_common_member_field_home SET uid='$uid'");
	$this->db->query("INSERT INTO `dbname`.pre_common_member_count SET uid='$uid', extcredits1='0', extcredits2='0', extcredits3='0', extcredits4='0', extcredits5='0', extcredits6='0', extcredits7='0', extcredits8='0'");
	// END
	return $uid;
}

其它的程式就比較簡單了,開啟程式的資料庫的使用者表,對比一下就知道了,下面提供幾個參考:
// ecmall
$this->db->query("INSERT INTO `ecmall`.ecm_member SET user_id='$uid', user_name='$username', email='$email', password='$password', gender='0', reg_time='".$this->base->time."', last_login='".$this->base->time."', last_ip='$regip', logins='1', ugrade='0', outer_id='0'");

// ecshop
$this->db->query("INSERT INTO `ecshop`.ecs_users SET user_id='$uid', email='$email', user_name='$username', password='$password', reg_time='".$this->base->time."', last_login='".$this->base->time."', last_ip='$regip'");

// thinksns
$this->db->query("INSERT INTO `thinksns`.ts_ucenter_user_link SET uid='$uid', uc_uid='$uid', uc_username='$username'");
$this->db->query("INSERT INTO `thinksns`.ts_user SET uid='$uid', email='$email', password='$password', uname='$username', is_active='1', is_init='1'");
$this->db->query("INSERT INTO `thinksns`.ts_user_online SET uid='$uid', ctime='".$this->base->time."'");

(需要說明的是部分程式的登入機制不同使得此方法的首次註冊同步登入無法實現)