100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > ThinkPHP3.2.2实现持久登录(记住)功能办法【PHP】

ThinkPHP3.2.2实现持久登录(记住)功能办法【PHP】

时间:2023-01-08 20:21:20

相关推荐

ThinkPHP3.2.2实现持久登录(记住)功能办法【PHP】

后端开发|php教程

ThinkPHP3.2.2,持久登录

后端开发-php教程

仿包图网素材下载网站源码织梦模板,ubuntu怎么调时间,爬虫用哪些库,php实验三php表单交互,seo 算法测试lzw

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

源码大师下载,vscode更改导包路劲,gpm鼠标 ubuntu,tomcat省略项目名,vc做爬虫,php判断访问设备,seo异地排名查询推广平台,淘宝刷钻平台网站lzw

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

php邮局系统源码,ubuntu修复桌面环境,用爬虫排课表,php 在先,seo128lzw

+------------+-------------+------+-----+---------+----------------+| Field | Type | Null | Key | Default | Extra |+------------+-------------+------+-----+---------+----------------+| uid | int(11) | NO | PRI | NULL | auto_increment || uname | varchar(20) | YES | | NULL | || upwd | varchar(20) | YES | | NULL | || uflag | int(11) | YES | | NULL | || identifier | varchar(32) | YES | | NULL | || token | varchar(32) | YES | | NULL | || timeout | int(11) | YES | | NULL | |+------------+-------------+------+-----+---------+----------------+

在用户勾选了”记住我”登录时,应该生成一个唯一的 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 \Think\Verify(); //$verify->useZh = true; //使用中文验证码 $verify->length = 4; $verify->entry(); } //验证登录 public function check(){ $verify = new \Think\Verify(); if($verify->check(I("yzm"))){ //判断用户名密码 $user = new \Test\Model\TestModel(); $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;//存入cookiesetcookie(auth,"$identifier:$token",$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 = "Think\Verify"; //第三个参数为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, )); $str = \; $arr_len = count($arr); for ($i = 0; $i 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,$identifier,$token,$timeout){ $admin = M("admin"); $data[identifier] = $identifier; $data[ oken] = $token; $data[ imeout] = $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[ oken] = $token; }else{ return false; } $admin = M("admin"); $info = $admin->getByidentifier($arr[identifier]); if($info != null){ if($arr[ oken] != $info[ oken]){ return false; }else if($now > $info[ imeout]){ return false; }else{ return $info; } }else{ return false; } }}

视图 登录页 test.html

Document

补充:小编在这里推荐一款本站的php格式化美化的排版工具帮助大家在以后的PHP程序设计中进行代码排版:

php代码在线格式化美化工具:/code/phpformat

更多关于thinkPHP相关内容感兴趣的读者可查看本站专题:《ThinkPHP入门教学》、《ThinkPHP常用方法总结》、《smarty模板入门基础教学》及《PHP模板技术总结》。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。