手机版

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

时间:2021-10-30 来源:互联网 编辑:宝哥软件园 浏览:

本文介绍了在ThinkPHP3.2.2中实现持久登录功能的方法,分享给大家参考,如下:

实现持久登录,即用户登录时,勾选‘记住我’后,无论浏览器是否关闭,只要不注销,就会一直保持指定时间内的登录状态(缺点是在另一台电脑登录后,前一台电脑无法继续保持登录状态)。

首先,持久登录是使用cookie实现的,但是cookie不能存储用户密码等重要信息,即使是加密的。解决方案是在用户登录表中创建新的三个字段标识符:第二个标识符,令牌:永久登录标识符,超时:永久登录超时。

- - - - - - |字段|类型| Null |键|默认值| Extra |-----| uid | int(11)| NO | PRI | Null | auto _ increment | | uname | varchar(20)| YES | | Null | | upwd | varchar(20)| YES | | Null | | | uflag | int(11)| YES | | Null | |标识符| varchar(32)| YES | | Null | | token | varchar(32)| YES | | Null | | time out | int(11)| YES将两个代表身份的值写入cookie,并将cookie的过期时间设置为超时,例如:setcookie ('auth ',' $ identifier : $ token ',$ time out);同时向数据表中插入三个值;当用户再次访问网站时,首先判断cookie是否包含auth,如果包含auth,则前往数据库进行身份比对(标识符和令牌),比对成功后,将用户信息写入会话,并保持用户登录。

代码:

TestController.class.php主计长

?phpnamespace测试\控制器;使用思考\控制器;类测试控制器扩展了控制器{公共函数登录(){//判断是否永久登录$ this-CheckLong();//已经登录则跳转至个人中心if(isset($ _ SESSION[' username ']){ $ this-redirect(' Test/u center ');}else{ //判断是否存在COOKIE if(isset($ _ COOKIE[' username ']){ $ this-assign(' username ',$ _ COOKIE[' username ']);} //显示注册页$ this-display(' test ');} } //显示验证码公共函数verifyImg(){ $ Verify=new \ Think \ Verify();//$ verify-Usezh=true;//使用中文验证码$ verify-长度=4;$ verify-entry();} //验证登录公共函数check(){ $ Verify=new \ Think \ Verify();if($ verify-check(I(' yzm ')){//判断用户名密码$ user=新建\测试\模型\测试模型();$ RES=$ user-CheckName(I(' username ')、I(' pwd ');if($res===false){ echo '用户名或密码错误;}else{ //用户信息存入会话会话('用户名,$ RES[' uname ']);会话(' id ',$ RES[' uid ']);//如果用户勾选了'记住我,则保持持久登陆如果(我(’记住)){ $ salt=$ this-random _ str(16);//第二分身标识$identifier=md5($salt .MD5(I(’用户名')。$盐));//永久登录标识$token=md5(uniqid(rand(),true));//永久登录超时时间(1周)$ time out=time()3600 * 24 * 7;//存入cookie setcookie('auth ',' $identifier:$token ',$ time out);$ user-保存内存($ RES[' uid '],$identifier,$token,$ time out);} //把用户名存入饼干,退出登录后在表单保存用户名信息setcookie('username ',I('username '),time()3600 * 24);//跳转至会员中心$这个-重定向(“测试/输入”);} }else{ echo '输入错误;} } //测试字符串查找函数公共函数第一次测试(){ $ param=' Think \ Verify//第三个参数为没错,返回"思考";没有第三个参数,返回\验证$ name=strtr($ param,' \\ ',true);echo $ name} //用户中心公共函数ucenter(){ //判断是否永久登录$ this-CheckLong();$this-assign('session ',$ _ SESSION);$ this-display(' ucenter ');} //退出登录公共函数log in out(){ session(null);setcookie('auth ','',time()-1);$这个-重定向('测试/登录');} //生成随机数,用于生成盐公共函数random_str($length){ //生成一个包含大写英文字母,小写英文字母,数字的数组$arr=array_merge(range(0,9),range('a ',' Z '),range('A ',' Z '));$ str=$ arr _ len=count($ arr);对于($ I=0;一美元长度;$i ){ $rand=mt_rand(0,$ arr _ len-1);$str .=$ arr[$ rand];}返回$ str} //判断是否持久登录公共函数checkLong(){ $ check=new \ Test \ Model \ Test Model();$ is _ long=$ check-check memory();if($ is _ long===false){ } else { session(' username ',$ is _ long[' uname ']);会话(' id ',$ is _ long[' uid ']);} }}模型TestModel.class.php

?phpnamespace测试\模型;使用思考\模型;类测试模型扩展了型号{ //验证登录信息公共函数checkName($name,$ pwd){ $ admin=M(' admin ');$ info=$ admin-getByUname($ name);if($info!=null){ //验证密码if($ info[' upwd ']==$ pwd){ return $ info;} else { return false } } else { return false } }//当用户勾选'记住我公共函数保存内存($ uid,$identifier,$token,$ time out){ $ admin=M(' admin ');$ data[' identifier ']=$ identifier;$ data[' token ']=$ token;$ data[' time out ']=$ time out;$其中=' uid=' .$ uid $ RES=$ admin-data($ data)-where($ where)-save();返回$ res} //验证用户是否永久登录(记住我)公共函数check memory(){ $ 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[' time out ']){ return false;} else { return $ info } } else { return false } } }视图登录页test.html

DOCTYPE html html lang=' en ' head meta charset=' UTF-8 ' title document/title/head dy form action=' _ _ CONTROLLER _ _/check ' method=' post ' if条件='$username neq null '输入类型=' text '名称=' username '占位符='用户名值=' { $ username } br否则/输入类型=' text '名称=' username '占位符='用户名br/ifinput type=' password ' name=' pwd ' placeholder='密码br输入类型=' text '名称=' yzm '占位符='验证码img src=' http : _ _ CONTROLLER _ _/验证img ' OnClick='这一点。 src=这个。src?数学。random()"br输入类型="复选框" name="memory"id="memory "标签为="memory "记住我/labelinput类型='提交'值='提交/表单/正文/html视图个人中心ucenter.html

DOCTYPE html html lang=' en ' head meta charset=' UTF-8 ' titleDocumenttitle/head body if condition=' $ session[' username ']neq null ' I { $ session。用户名},/i其他/i游客,/i /if欢迎您br a href=' _ _ CONtrol _ _/log in out '退出登录/a/body/html附:模块目录

补充:小编在这里推荐一款本站的服务器端编程语言(专业超文本预处理器的缩写)格式化美化的排版工具帮助大家在以后的服务器端编程语言(专业超文本预处理器的缩写)程序设计中进行代码排版:

服务器端编程语言(专业超文本预处理器的缩写)代码在线格式化美化工具:http://工具。JB 51。net/代码/PHP格式

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

希望本文所述对大家基于ThinkPHP框架的服务器端编程语言(专业超文本预处理器的缩写)程序设计有所帮助。

版权声明:ThinkPHP3.2.2实现持久登录(记得我)功能的方法是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。