php 自动登录实现

PHP 自动登录实现方法
使用 Cookie 实现自动登录
通过设置 Cookie 存储用户登录凭证,实现自动登录功能。需要确保 Cookie 安全,避免敏感信息直接存储。

// 用户登录成功后设置 Cookie
$token = bin2hex(random_bytes(32)); // 生成随机 token
setcookie('remember_token', $token, time() + 86400 * 30, '/', '', true, true); // 30 天有效期
// 同时将 token 和用户 ID 存入数据库
// 检查自动登录 Cookie
if (!isset($_SESSION['user_id']) && isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
// 查询数据库验证 token
// 验证通过后设置用户会话
$_SESSION['user_id'] = $user_id;
}
使用 Session 持久化
通过延长 Session 有效期实现自动登录,适用于短期自动登录场景。
// 设置 Session 过期时间
ini_set('session.gc_maxlifetime', 86400 * 30); // 30 天
session_set_cookie_params(86400 * 30);
session_start();
安全注意事项
- 使用 HTTPS 协议传输 Cookie
- 对 Cookie 内容加密处理
- 定期更换 token
- 实现 token 撤销机制
- 记录登录设备信息
数据库设计示例
CREATE TABLE remember_tokens (
id INT AUTO_INCREMENT PRIMARY KEY,
user_id INT NOT NULL,
token VARCHAR(64) NOT NULL,
expires_at DATETIME NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
FOREIGN KEY (user_id) REFERENCES users(id)
);
完整实现示例
// 自动登录验证函数
function attemptAutoLogin() {
if (isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
// 数据库查询
$stmt = $pdo->prepare("SELECT user_id FROM remember_tokens WHERE token = ? AND expires_at > NOW()");
$stmt->execute([$token]);
$result = $stmt->fetch();
if ($result) {
$_SESSION['user_id'] = $result['user_id'];
return true;
}
}
return false;
}
// 登录成功后设置自动登录
function setAutoLogin($user_id) {
$token = bin2hex(random_bytes(32));
$expires = date('Y-m-d H:i:s', time() + 86400 * 30);
// 存储到数据库
$stmt = $pdo->prepare("INSERT INTO remember_tokens (user_id, token, expires_at) VALUES (?, ?, ?)");
$stmt->execute([$user_id, $token, $expires]);
setcookie('remember_token', $token, time() + 86400 * 30, '/', '', true, true);
}






