Laravel '记住我' 功能实现

本思路就是使用用户标识(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是否与数据库里面的一致,这样安全性相对而言就高一些了

©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 136,188评论 19 139
  • 22年12月更新:个人网站关停,如果仍旧对旧教程有兴趣参考 Github 的markdown内容[https://...
    tangyefei阅读 35,311评论 22 257
  • 转载,觉得这篇写 SQLAlchemy Core,写得非常不错。不过后续他没写SQLAlchemy ORM... ...
    非梦nj阅读 10,837评论 1 14
  • 发好朋友圈,你的微商就成功了一半。 微商通过朋友圈的打造,可以向客户展示一个真实、真诚、有价值的形象,这也是直接构...
    想要留阅读 4,149评论 0 0
  • 我也不知道该写什么样的标题,本来想写在QQ空间的私人日记里,可是怎么也没有找到那一栏。于是我就找到了这里,准备写我...
    沉寂的石头阅读 1,882评论 0 0

友情链接更多精彩内容