欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

Laravel '记住我' 功能实现 有大用

Laravel '记住我' 功能实现

字数 176阅读 1,839

本思路就是使用用户标识(user_iduser_name)+登录标识(token),将他们存到用户浏览器的Cookie里,把token存入数据库,然后相比较是否相同即可。

1.在用户第一次登录的时候,将user_idtoken存入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是否与数据库里面的一致,这样安全性相对而言就高一些了

来自 https://www.jianshu.com/p/2829269fb7a3?utm_campaign=maleskine&utm_content=note&utm_medium=seo_notes&utm_source=recommendation


普通分类: