php 自动登录实现
实现 PHP 自动登录的方法
使用 Cookie 存储登录信息
通过设置 Cookie 存储用户登录凭证,实现自动登录功能。以下是一个基本实现示例:
// 用户登录成功后设置 Cookie
$expire = time() + 60 * 60 * 24 * 30; // 30天有效期
setcookie('username', $username, $expire, '/');
setcookie('token', md5($username.$password), $expire, '/');
// 检查自动登录
if(isset($_COOKIE['username']) && isset($_COOKIE['token'])) {
$username = $_COOKIE['username'];
$token = $_COOKIE['token'];
// 验证 token 是否有效
$user = getUserFromDatabase($username);
if($token === md5($user['username'].$user['password'])) {
$_SESSION['user'] = $user;
}
}
使用数据库存储登录令牌
更安全的方法是使用数据库存储随机生成的令牌:

// 生成并存储令牌
function generateLoginToken($userId) {
$token = bin2hex(random_bytes(32));
$expiry = date('Y-m-d H:i:s', strtotime('+30 days'));
// 存储到数据库
$sql = "INSERT INTO user_tokens (user_id, token, expiry) VALUES (?, ?, ?)";
$stmt = $pdo->prepare($sql);
$stmt->execute([$userId, $token, $expiry]);
setcookie('remember_token', $token, time() + 60 * 60 * 24 * 30, '/');
}
// 验证令牌
if(isset($_COOKIE['remember_token'])) {
$token = $_COOKIE['remember_token'];
$sql = "SELECT u.* FROM users u JOIN user_tokens t ON u.id = t.user_id
WHERE t.token = ? AND t.expiry > NOW()";
$stmt = $pdo->prepare($sql);
$stmt->execute([$token]);
if($user = $stmt->fetch()) {
$_SESSION['user'] = $user;
// 可选:更新令牌有效期
}
}
安全注意事项
- 始终使用 HTTPS 传输敏感信息
- 令牌应设置合理的过期时间
- 提供用户手动注销功能,清除所有相关 Cookie 和令牌
- 考虑实现并发登录检测和安全审计功能
增强安全性措施
- 绑定令牌到特定IP或设备
- 实现令牌使用次数限制
- 记录登录历史供用户查看
- 重要操作仍需密码验证
以上方法可以根据具体需求组合使用,建议优先考虑数据库存储令牌的方案,安全性更高。






