加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

ThinkPHP3.2.2实现持久登录(记住我)功能的方法

发布时间:2020-12-14 14:05:10 所属栏目:大数据 来源:网络整理
导读:本篇章节讲解ThinkPHP3.2.2实现持久登录功能的方法。供大家参考研究具体如下: 实现持久登录,即用户在登录时,勾选了"记住我"之后,无论是否关闭浏览器,只要不退出登录,在指定的时间内始终保持登录状态(缺点是在另一台电脑上登录过后,之前那

本篇章节讲解ThinkPHP3.2.2实现持久登录功能的方法。分享给大家供大家参考,具体如下:

实现持久登录,即用户在登录时,勾选了"记住我"之后,无论是否关闭浏览器,只要不退出登录,在指定的时间内始终保持登录状态(缺点是在另一台电脑上登录过后,之前那台电脑就不能继续保持登录状态)。

首先,持久登陆使用 cookie 实现,但是 cookie 中不能保存用户密码这样重要的信息,即使加密过。解决方案是在用户登录表中新建3个字段identifier:第二身份标识,token:永久登录标识,timeout:永久登录超时时间。

在用户勾选了"记住我"登录时,应该生成一个唯一的 identifier,一个唯一的 token,并且设置一个过期时间 timeout,把两个代表身份的值写入cookie,设置 cookie 过期时间为 timeout,例如:setcookie('auth',"$identifier:$token",$timeout); 同时把三个值插入数据表;当用户再一次访问网站时,首先判断 cookie 中是否含有 auth,如果含有,则去数据库中进行身份比对(identifier 和 token),比对成功时,把用户信息写入 session,同时用户保持登录状态。

代码:

控制器 TestController.class.php

checkLong(); //已经登录则跳转至个人中心 if(isset($_SESSION['username'])){ $this->redirect('Test/ucenter'); }else{ //判断是否存在cookie if(isset($_COOKIE['username'])){ $this->assign('username',$_COOKIE['username']); } //显示注册页 $this->display("test"); } } //显示验证码 public function verifyImg(){ $verify = new ThinkVerify(); //$verify->useZh = true; //使用中文验证码 $verify->length = 4; $verify->entry(); } //验证登录 public function check(){ $verify = new ThinkVerify(); if($verify->check(I("yzm"))){ //判断用户名密码 $user = new TestModelTestModel(); $res = $user->checkName(I("username"),I("pwd")); if($res === false){ echo "用户名或密码错误"; }else{ //用户信息存入session session("username",$res['uname']); session("id",$res['uid']); //如果用户勾选了"记住我",则保持持久登陆 if(I("remember")){ $salt = $this->random_str(16); //第二分身标识 $identifier = md5($salt . md5(I("username") . $salt)); //永久登录标识 $token = md5(uniqid(rand(),true)); //永久登录超时时间(1周) $timeout = time()+3600*24*7; //存入cookie setcookie('auth',$timeout); $user->saveRemember($res['uid'],$identifier,$token,$timeout); } //把用户名存入cookie,退出登录后在表单保存用户名信息 setcookie('username',I('username'),time()+3600*24); //跳转至会员中心 $this->redirect('Test/ucenter'); } }else{ echo "输入错误"; } } //测试strstr函数 public function strstrtest(){ $param = "ThinkVerify"; //第三个参数为true,返回'Think';没有第三个参数,返回'Verify' $name = strstr($param,'',true); echo $name; } //用户中心 public function ucenter(){ //判断是否永久登录 $this->checkLong(); $this->assign("session",$_SESSION); $this->display("ucenter"); } //退出登录 public function loginout(){ session(null); setcookie('auth','',time()-1); $this->redirect("Test/login"); } //生成随机数,用于生成salt public function random_str($length){ //生成一个包含 大写英文字母,小写英文字母,数字 的数组 $arr = array_merge(range(0,9),range('a','z'),range('A','Z')); $str = ''; $arr_len = count($arr); for ($i = 0; $i < $length; $i++){ $rand = mt_rand(0,$arr_len-1); $str.=$arr[$rand]; } return $str; } //判断是否持久登录 public function checkLong(){ $check = new TestModelTestModel(); $is_long = $check->checkRemember(); if($is_long === false){ }else{ session("username",$is_long['uname']); session("id",$is_long['uid']); } } }

模型 TestModel.class.php

getByUname($name); if($info != null){ //验证密码 if($info['upwd'] == $pwd){ return $info; }else{ return false; } }else{ return false; } } //当用户勾选"记住我" public function saveRemember($uid,$timeout){ $admin = M("admin"); $data['identifier'] = $identifier; $data['token'] = $token; $data['timeout'] = $timeout; $where = " uid = ".$uid; $res = $admin->data($data)->where($where)->save(); return $res; } //验证用户是否永久登录(记住我) public function checkRemember(){ $arr = array(); $now = time(); list($identifier,$token) = explode(':',$_COOKIE['auth']); if (ctype_alnum($identifier) && ctype_alnum($token)){ $arr['identifier'] = $identifier; $arr['token'] = $token; }else{ return false; } $admin = M("admin"); $info = $admin->getByidentifier($arr['identifier']); if($info != null){ if($arr['token'] != $info['token']){ return false; }else if($now > $info['timeout']){ return false; }else{ return $info; } }else{ return false; } } }

视图 登录页 test.html

Document

视图 个人中心 ucenter.html

Documenttitle> {$session.username}, 游客, 欢迎您

附:模块目录

补充:

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《》、《》、《》及《》。

希望本文所述对大家基于ThinkPHP框架的PHP程序设计有所帮助。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读