用戶在主站(CMS)登入後,自動同步登入 phpBB3 論壇,無需二次輸入帳密。核心思路:模擬 phpBB3 的 Cookie 結構 + 向 phpBB3 資料庫 sessions 表寫入對應 Session 記錄。
<?php
// 1. 生成 32 位 Session ID
function create_sess_id($len = 32) {
list($u, $s) = explode(' ', microtime());
$time = (float)$u + (float)$s;
$rand = rand(100000, 999999);
$rand = rand($rand, $time);
mt_srand($rand);
$rand = mt_rand();
return substr(md5(md5($time) . md5($rand)), 0, $len);
}
// 2. 參數初始化
$sess_id = create_sess_id(32);
$cookie_path = '/';
$cookie_name = 'phpbb3_1w36a'; // phpBB3 實際 Cookie 前綴,需對應 config.php
$user_ip = $_SERVER['REMOTE_ADDR'];
$user_browser = $_SERVER['HTTP_USER_AGENT'];
// 3. 驗證主站用戶並取得 phpBB3 user_id
$link = mysql_connect("localhost", "root", "");
mysql_select_db("cms");
$username = $_POST['username'];
$password = $_POST['password'];
// 此處應加入密碼驗證邏輯(省略),驗證通過後:
$query = "SELECT user_id FROM bbs_users WHERE username = '$username'";
$result = mysql_query($query);
$row = mysql_fetch_array($result);
$user_id = $row['user_id'];
mysql_close($link);
// 4. 寫入 Cookie(供 phpBB3 讀取)
setcookie($cookie_name . '_u', $user_id, time() + 100000000, $cookie_path, $user_ip, false);
setcookie($cookie_name . '_sid', $sess_id, time() + 100000000, $cookie_path, $user_ip, false);
// 5. 向 phpBB3 sessions 表寫入 Session 記錄
$link = mysql_connect("localhost", "root", "");
mysql_select_db("cms"); // 假設 phpBB3 同庫不同表前綴
$sql = "INSERT INTO bbs_sessions
(session_id, session_user_id, session_last_visit, session_start, session_time, session_ip, session_browser, session_page)
VALUES
('$sess_id', $user_id, " . time() . ", " . time() . ", " . time() . ", '$user_ip', '$user_browser', 'index.php')";
mysql_query($sql);
mysql_close($link);
// 6. 跳轉論壇首頁
header("Location: https://192.168.0.100/bbs/index.php");
?>
| 項目 | 說明 |
|---|---|
| Cookie 名稱 | 需與 phpBB3 config.php 中 $cookie_name 一致(預設 phpbb3_ + 隨機字串) |
| Cookie 域/路徑 | 跨子域需設 domain=.example.com,路徑通常為 / |
| Session 表欄位 | phpBB3 核心欄位:session_id、session_user_id、session_time、session_ip、session_browser、session_page |
| 時間戳 | session_last_visit、session_start、session_time 均用 time() |
| User Agent | 必須記錄,phpBB3 驗證時會比對防劫持 |
styles/prosilver/template/ucp_register.html,替換為跳轉主站註冊頁:<script>window.location='member.php';</script>ucp_profile.html(修改資料)跳轉主站會員中心bbs_users、bbs_user_group 寫入資料,注意群組權限設定phpbb_users 表,主站直接讀寫,但耦合度高、升級風險大password_verify(),不直接比對明文random_bytes(16) + bin2hex() 產生(PHP 7+),而非 mt_randHttpOnly、Secure、SameSite=Laxsessions 表過期記錄phpBB3 同步登入本質是「跨系統 Session 共享」,通過模擬 Cookie 結構、寫入 sessions 表實現。關鍵在於 Cookie 參數與 phpBB3 設定完全一致、Session 記錄欄位完整、主站註冊/修改流程同步雙向寫入。生產環境建議封裝為獨立 Service 類別,配合消息隊列處理同步任務,確保最終一致性。