首页新闻找找看学习计划

用thinkphp实现类似于QQ登录时的记住密码

0
悬赏园豆:30 [已解决问题] 解决于 2016-11-30 14:41

做的后台登录界面,想做成类似于QQ登录时,选中记住密码框,下次登录就不需要输入用户名和密码了,直接enter键就进入页面了。求案例,最好详细点。

我爱小少女的主页 我爱小少女 | 初学一级 | 园豆:160
提问于:2016-11-26 00:24
< >
分享
最佳答案
0

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

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

+------------+-------------+------+-----+---------+----------------+
| 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

<?php
namespace Test\Controller;
use Think\Controller;

class TestController extends Controller {
    public function login(){
        //判断是否永久登录
        $this->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;
                    //存入cookie
                    setcookie('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', '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 \Test\Model\TestModel();
        $is_long = $check->checkRemember();
        if($is_long === false){
            
        }else{
            session("username",$is_long['uname']);
            session("id",$is_long['uid']);
        }
    }

}

模型 TestModel.class.php

<?php
namespace Test\Model;
use Think\Model;

class TestModel extends Model{

    //验证登录信息
    public function 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;
        }
    }

    //当用户勾选"记住我"
    public function saveRemember($uid,$identifier,$token,$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;
        }
    }
}

视图你就自己写吧 只能帮到这里了

收获园豆:20
yangzailu | 初学一级 |园豆:9 | 2016-11-29 13:30

试过,没成功。。。。

我爱小少女 | 园豆:160 (初学一级) | 2016-11-30 14:41

@我爱小少女: 那就不知道了

yangzailu | 园豆:9 (初学一级) | 2016-12-12 09:50
其他回答(2)
0

把用户输入的信息用cookie保存, 页面加载时, 从cookie读出来就行了

收获园豆:5
风浪 | 园豆:2600 (老鸟四级) | 2016-11-26 11:13
0

用户和密码和是否记住密码三个信息保存在cookie里,,当然是要进行加密保存的,,比如用户名可以明文..密码md5 sha rsa等加密,记住不能把数据库的加密那个保存在cookie里,,然后下次打开登录页面的时候,读取cookie判断是否记住密码,,如果是读取用户和密码进行数据库对比

收获园豆:5
Kerwin1202 | 园豆:68 (初学一级) | 2016-11-26 16:17
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册