首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Discuz! X3 免激活同步登入修改教學 (uc.php synlogin 覆寫)

     編輯:PHP 相關知識

Discuz! 預設同步登入需 UCenter 啟用通訊,若需繞過激活直接同步登入 (適用 X3,理論相容 2.5),可修改 api/uc.php 中的 synlogin 函式。核心邏輯:若本地會員不存在,即時從 UCenter 抓取資料建立會員並寫入相關資料表,最後發放 Cookie。

修改步驟

  1. 開啟 source/api/uc.php (或 api/uc.php 視版本而定)。
  2. 找到 synlogin 函式 (約 180 行),定位 if(($member = getuserbyuid($uid, 1))) { 區塊。
  3. 將原本僅處理既有會員的邏輯,擴充為「不存在則自動建立」。

修改前 vs 修改後

原始碼 (僅處理既有會員)

if (($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
}

修改後 (自動建立會員並同步登入)

if (($member = getuserbyuid($uid, 1))) {
    dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
} else {
    // 載入 UCenter 客戶端函式
    if (!function_exists('uc_get_user')) {
        loaducenter();
    }
    // 從 UCenter 取得會員資料
    $user = uc_get_user($uid, 1);
    if ($user) {
        $time = time();
        // 1. common_member 基本資料
        DB::query("REPLACE INTO ".DB::table('common_member')." SET
            `uid`='{$user[0]}',
            `username`='{$user[1]}',
            `password`='".md5(random(10))."',
            `email`='{$user[2]}',
            `adminid`='0',
            `groupid`='10',
            `regdate`='{$time}',
            `emailstatus`='0',
            `credits`='0',
            `timeoffset`='9999'");

        // 2. common_member_status 狀態資料
        DB::query("REPLACE INTO ".DB::table('common_member_status')." SET
            `uid`='{$user[0]}',
            `regip`='{$_G['clientip']}',
            `lastip`='{$_G['clientip']}',
            `lastvisit`='{$time}',
            `lastactivity`='',
            `lastpost`='0',
            `lastsendmail`='0'");

        // 3. common_member_count 積分擴充
        DB::query("REPLACE INTO ".DB::table('common_member_count')." SET
            `uid`='{$user[0]}',
            `extcredits1`='0', `extcredits2`='0', `extcredits3`='0',
            `extcredits4`='0', `extcredits5`='0', `extcredits6`='0',
            `extcredits7`='0', `extcredits8`='0'");

        // 4. 相關 profile / forum / home 空表
        DB::query("REPLACE INTO ".DB::table('common_member_profile')." SET `uid`='{$user[0]}'");
        DB::query("REPLACE INTO ".DB::table('common_member_field_forum')." SET `uid`='{$user[0]}'");
        DB::query("REPLACE INTO ".DB::table('common_member_field_home')." SET `uid`='{$user[0]}'");

        // 5. 統計表註冊人數 +1
        DB::query("UPDATE ".DB::table('common_stat')." SET `register`=`register`+1 WHERE `daytime`='".date('Ymd', $time)."'");

        // 6. 重新讀取會員並發放 Cookie
        if (($member = getuserbyuid($uid, 1))) {
            dsetcookie('auth', authcode("$member[password]\t$member[uid]", 'ENCODE'), $cookietime);
        }
    }
}

關鍵點解析

  • REPLACE INTO:若 UID 已存在則更新,不存在則插入,避免主鍵衝突。
  • 密碼處理:產生隨機密碼 md5(random(10)),實際驗證走 UCenter,本地密碼僅佔位。
  • groupid=10:預設註冊會員組,請依站點設定調整。
  • timeoffset=9999:表示使用預設時區,避免時間顯示異常。
  • 安全性提醒:此修改繞過 UCenter 通訊驗證,請確認 UCenter 端已做好 IP 白名單或金鑰驗證,防止偽造 UID 攻擊。

適用版本與測試

  • 實測版本:Discuz! X3.4 / X3.5
  • 理論支援:X2.5 以上 (資料表結構相容)
  • 測試步驟:UCenter 端登入 → 點擊同步登入連結 → 應自動導向論壇並呈現登入狀態。

常見問題

Q: 修改後同步登入仍失效?
檢查 uc_get_user 是否正確回傳陣列;確認 DB::table 前綴設定正確;查看 Apache/Nginx 錯誤日誌是否有 SQL 執行失敗。
Q: 會員資料不同步更新 (如 Email 變更)?
本修改僅處理首次登入建立;後續資料同步需配合 uc_user_edit 通知或排程同步。
Q: 是否影響 UCenter 其他應用?
不影響,僅改變 Discuz 端接收同步登入時的處理邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved