下面看到一站長分享的關于dz注冊與登錄的一個流程了,包括了用戶中心的同步配置,代碼如下希望對各位同學會有所幫助.
注冊流程
第一步:/source/class/class_member.php: on_register注冊入口,602 左右:
- if(!$activation) {//不為空,說明用戶已經注冊過
- //將用戶注冊到用戶中心,調用第二步uc_user_register方法
- $uid = uc_user_register(addslashes($username), $password, $email, $questionid, $answer, $_G['clientip']);
第二步:/uc_client/client.php:uc_user_register 調用將用戶注冊到用戶中心的方法,調用第三步的onregister方法.
第三步:/uc_client/control/user.php: onregister 將用戶注冊到用中心,調用第四步add_user方法
第四步:/uc_client/model/user.php:add_user 將用戶注冊到ucenter返回用戶id
第五步:/source/class/class_member.php,685行 左右,會把用戶信息寫到common_member表,注冊結束.
- C::t(‘common_member’)->insert($uid, $username, $password, $email, $_G['clientip'], $groupinfo['groupid'], $init_arr);
登陸流程
第一步:/source/class/class_member.php:on_login 登陸入口,87行左右,調用userlogin方法如下:
- $result = userlogin($_GET['username'], $_GET['password'], $_GET['questionid'], $_GET['answer'], $this->setting['autoidselect'] ? ‘auto’ : $_GET['loginfield'], $_G['clientip']);
第二步:/source/function/function_member.php: logincheck 72行左右 調用 logincheck,如下:
- if(!($_G['member_loginperm'] = logincheck($_GET['username']))) {
- showmessage(‘login_strike’);
- } //開源軟件:Vevb.com
第三步:/source/function/function_member.php: userlogin 用戶登陸查詢相關表,第29行-40行左右會用調用uc_user_login方法:
- if($isuid == 3) {
- if(!strcmp(dintval($username), $username) && getglobal(‘setting/uidlogin’)) {
- $return['ucresult'] = uc_user_login($username, $password, 1, 1, $questionid, $answer, $ip);// uc_client/client.php
- } elseif(isemail($username)) {
- $return['ucresult'] = uc_user_login($username, $password, 2, 1, $questionid, $answer, $ip);// uc_client/client.php
- }
- if($return['ucresult'][0] <= 0 && $return['ucresult'][0] != -3) {
- $return['ucresult'] = uc_user_login(addslashes($username), $password, 0, 1, $questionid, $answer, $ip);
- }
- } else {
- $return['ucresult'] = uc_user_login(addslashes($username), $password, $isuid, 1, $questionid, $answer, $ip);
- }
/uc_client/client.php: 包含uc_開頭的全部方法,例uc_user_login
/uc_client/control/user.php: onlogin 根據條件判斷登陸,114-120 判斷查詢條件查詢出ucenter用戶信息
/uc_client/model/user.php 包含有get_user_by_uid,get_user_by_username 等方法 第50行左右查詢common_member表,如下:
$member = getuserbyuid($return['ucresult']['uid'], 1);
回到/source/class/class_member.php文件on_login方法,第95-106 行左右會根據條件$result['status']==-1,寫common_member表,并查詢出寫入信息:
- C::t(‘common_member’)->insert($uid, $result['ucresult']['username'], md5(random(10)), $result['ucresult']['email'], $_G['clientip'], $groupid, $init_arr);
- $result['member'] = getuserbyuid($uid);
ps:以上所有方法都會先執行,/source/class/discuz/discuz_application.php: _init_user,所以如果要自己寫checklogin 可以考慮從_init_user 方法入手,如果與自己的平臺做bbs的打通.
注冊可以考慮在第4步做操作,調用自己平臺的注冊接口,注冊用戶,并將用戶id返回,寫入到ucenter.
/uc_client/model/user.php:add_user 方法內,登陸打通可以考慮在 第三步調用uc_user_login 方法前.
1.調用自己平臺接口查詢用戶相關信息
2.查詢ucenter中用戶是否存在
3.如果不存在insert一條數據
4.common_member可以寫也可以不寫,如此時不寫 $result['status']==-1 會在class_member 95-106 行左右寫入
如果在自己平臺處于登陸狀態,在bbs也為登陸狀態,則可以考慮從_init_user 方法入手,做登錄判斷.
無法同步登陸需要注意檢查的地方:
1.ucenter中應用的配置信息是否完全正確,并與目標站后臺的ucenter接口配置信息一致.
2.如果遇到通信成功,但是一邊能登陸一邊無法同步登陸的情況,請首先檢查 uc_client/data/cache/apps.php中的站點信息是否完全.
3.請注意編碼以及程序的BOM頭導致返回信息亂碼的情況.
新聞熱點
疑難解答