本思路就是使用用户标识(user_id
或user_name
)+登录标识(token
),将他们存到用户浏览器的Cookie里,把token存入数据库,然后相比较是否相同即可。
1.在用户第一次登录的时候,将user_id
和token
存入cookie,token
存入用户表。
// 用户登录了,并且拿到了用户信息
$_SESSIONS['auth'] = $user; // 使用session存储用户的信息
// 使用不可逆算法生成token
// uniqid() 获取一个带前缀、基于当前时间微秒数的唯一ID
$rememberToken = md5(uniqid(rand(), TRUE));
$rememberMe = $userId . ':' . $rememberToken;
// 对$rememberMe进行可逆的加密,PHP里有base64、mcrypt、openssl等,这里使用openssl
$pass = '1234'; // 自定
$method = 'des-ede3';
$encryptRememberMe = openssl_encrypt($rememberMe, $method, $pass);
// 将加密过的字符串放入cookie,并设置超时时间,建议不要超过一个月, 下边保存时间为15天
setcookie('remember_me', $encryptRememberMe, time() + 15 * 86400 );
2.用户每次打开网站时验证登录状态
// 获取cookie
$rememberMeCookie = $_COOKIE["remember_me"];
if (!isset($_SESSION['auth']) && $rememberMeCookie) {
// 解密获取cookie真正的值
$pass = '1234';
$method = 'des-ede3';
$rememberMe = openssl_decrypt($rememberMe, $method, $pass);
list($userId, $rememberToken) = explode(':', $rememberMe);
// 根据用户id从数据库获取用户信息,记得要对$rememberMe进行防sql注入,以防别人猜出存入cookie值的加密算法,假设用户信息为$user的数组
//比较token是否相同
if (!empty($user) && $user['remember_token'] === $rememberToken) {
// 设置用户的session
$SESSIONS['auth'] = $user;
}
}
3.用户退出登录时记得删除cookie
// 删除cookie
setcookie('remember_me', '', time() - 3600 );
// 再删除session
unset($_SESSION['auth']);
session_destroy();
至此就完成了「 记住我」的功能,cookie使用了可逆的加密,就算被别人破解了,后面还会去验证token是否与数据库里面的一致,这样安全性相对而言就高一些了
网友评论