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

Discuz! 整合登入實戰:摒棄通行證,直接同步會員系統

     編輯:PHP 綜合知識

Discuz! 作為國內最流行的論壇系統,雖內建通行證機制,但在實際專案中常面臨「雙用戶表」困擾:既增加註冊管理成本,又浪費資料庫資源。本文分享如何繞過通行證,直接在自有系統中實現與 Discuz! 的同步登入,核心在於複用 Discuz! 的 Cookie 生成與驗證邏輯。

兩種整合路徑

方案一:直接引用 Discuz! 公用檔案(最簡單)

若你的系統架構允許,直接 include 'discuz_root/include/common.inc.php'; 即可。引用後,$discuz_uid 與 $discuz_user 變數即代表當前登入會員的 UID 與用戶名,後續業務邏輯可直接判斷這兩個變數。

方案二:提取核心函數至自有框架(彈性較高)

若不想引入整個 Discuz! 環境,只需從 global.func.php 複製三個關鍵函數到自有函式庫:

  • dsetcookie() — Discuz! 專用 Cookie 寫入函數
  • authcode() — 可逆加密/解密函數
  • clearcookies() — 清除 Cookie 函數(可選)

自寫登入函數範例

function login($array) {
    $username = $array['username'];
    $password = $array['password'];

    // 1. 驗證帳密
    $sql = "SELECT `uid`, `password`, `secques` FROM `cdb_members` 
            WHERE `username` = '$username' AND `password` = md5('$password')";
    try {
        $rs = $this->_db->query($sql);
    } catch (Exception $e) {
        exit("查詢出錯:" . $e->getMessage());
        return 0;
    }
    $row = $this->_db->fetch($rs);

    if ($row) {
        // 2. 登入成功,寫入 auth Cookie
        dsetcookie('sid', '', -2423234234); // 註銷舊 sid
        $secques   = $row['secques'];
        $uid       = $row['uid'];
        $formPassword = $row['password'];

        // 關鍵:加密鍵 '123' 必須與 Discuz! 設定完全一致
        dsetcookie('auth', authcode("$formPassword\t$secques\t$uid", 'ENCODE', '123'), 0);
        return 1; // 成功
    } else {
        return 2; // 帳密錯誤
    }
}

三大「必須一致」的關鍵點

  1. global.func.php 原始檔案中的 authcode 定義
  2. 你複製到專案裡的 authcode 函數內容
  3. 呼叫 authcode 時傳入的第三個參數(加密鍵,範例中的 '123')

任一處不一致,Cookie 解密失敗,導致論壇端無法識別登入狀態。

常見問題排查

  • Cookie 域/路徑設定是否與論壇一致(config.inc.php 中的 $cookie_domain、$cookie_path)
  • 資料表前綴 cdb_ 是否正確
  • 密碼加密方式:舊版 Discuz! 為 md5(password),新版可能為 md5(md5(password).salt),需對應調整 SQL

掌握核心加密邏輯後,同步登入、單點登出、第三方 OAuth 綁定等進階功能皆可舉一反三。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved