在PHP中實現唯一登錄(Single Sign-On,簡稱SSO),通常涉及到以下幾個步驟:
用戶認證:首先,你需要一個認證系統來驗證用戶的身份。這通常是通過數據庫查詢來完成的。
會話管理:一旦用戶被認證,你需要將會話信息存儲在服務器端,以便在不同的頁面和服務中識別用戶。
會話持久化:為了確保用戶在關閉瀏覽器后仍然保持登錄狀態,你需要將會話數據持久化到客戶端(例如使用Cookie或Session ID)。
防止重復登錄:為了防止同一用戶在多個標簽頁或窗口中同時登錄,你需要檢查用戶的登錄狀態。
下面是一個簡單的示例,展示了如何使用PHP和Session來實現唯一登錄:
假設你有一個用戶表 users
,其中包含用戶ID、用戶名和密碼。
CREATE TABLE users (
id INT AUTO_INCREMENT PRIMARY KEY,
username VARCHAR(50) NOT NULL UNIQUE,
password VARCHAR(255) NOT NULL
);
創建一個登錄腳本 login.php
,用于處理用戶登錄。
<?php
session_start();
// 假設你已經連接到數據庫
$conn = new mysqli('localhost', 'username', 'password', 'database');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 獲取用戶輸入
$username = $_POST['username'];
$password = $_POST['password'];
// 驗證用戶
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$user = $result->fetch_assoc();
if (password_verify($password, $user['password'])) {
// 用戶認證成功
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
header("Location: dashboard.php");
} else {
echo "Invalid password.";
}
} else {
echo "User not found.";
}
$stmt->close();
$conn->close();
?>
在 dashboard.php
中,你可以檢查用戶的登錄狀態。
<?php
session_start();
if (!isset($_SESSION['user_id']) || !isset($_SESSION['username'])) {
header("Location: login.php");
exit();
}
echo "Welcome, " . $_SESSION['username'] . "!";
?>
為了防止用戶在多個標簽頁中同時登錄,你可以在登錄時生成一個唯一的Token,并將其存儲在Session中。
<?php
session_start();
if (!isset($_SESSION['user_id']) || !isset($_SESSION['username']) || !isset($_SESSION['token'])) {
header("Location: login.php");
exit();
}
// 檢查Token是否有效
if ($_SESSION['token'] !== $_COOKIE['token']) {
header("Location: login.php");
exit();
}
// 生成新的Token
function generateToken() {
return bin2hex(random_bytes(32));
}
$_SESSION['token'] = generateToken();
setcookie('token', $_SESSION['token'], time() + 3600); // Token有效期為1小時
?>
在 login.php
中,驗證Token:
<?php
session_start();
if (!isset($_POST['username']) || !isset($_POST['password'])) {
header("Location: login.php");
exit();
}
// 假設你已經連接到數據庫
$conn = new mysqli('localhost', 'username', 'password', 'database');
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
}
// 獲取用戶輸入
$username = $_POST['username'];
$password = $_POST['password'];
// 驗證用戶
$stmt = $conn->prepare("SELECT * FROM users WHERE username = ?");
$stmt->bind_param("s", $username);
$stmt->execute();
$result = $stmt->get_result();
if ($result->num_rows > 0) {
$user = $result->fetch_assoc();
if (password_verify($password, $user['password'])) {
// 用戶認證成功
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['token'] = generateToken();
setcookie('token', $_SESSION['token'], time() + 3600); // Token有效期為1小時
header("Location: dashboard.php");
} else {
echo "Invalid password.";
}
} else {
echo "User not found.";
}
$stmt->close();
$conn->close();
?>
在 dashboard.php
中,驗證Token:
<?php
session_start();
if (!isset($_SESSION['user_id']) || !isset($_SESSION['username']) || !isset($_SESSION['token'])) {
header("Location: login.php");
exit();
}
// 檢查Token是否有效
if ($_SESSION['token'] !== $_COOKIE['token']) {
header("Location: login.php");
exit();
}
// 生成新的Token
function generateToken() {
return bin2hex(random_bytes(32));
}
$_SESSION['token'] = generateToken();
setcookie('token', $_SESSION['token'], time() + 3600); // Token有效期為1小時
?>
通過這種方式,你可以實現一個簡單的唯一登錄系統。實際應用中,你可能還需要考慮更多的安全措施,例如使用HTTPS、防止CSRF攻擊等。