单用户登陆demo-后者挤到前者,类似QQ

单用户登陆demo ,采用的是Tp5。

流程是,当用户首次登陆是验证用户帐号密码,成功的,用当前时间戳加上用户id和ip 拼接成一个标识,暂且sign ,然后存入cookie ,时间戳存入缓存redis  ,session 携带用户信息

    //单点登陆demo
    public function olineOneLogin()
    {   
        $params = Request::only('username,password');
        $validate = Validate::make([
            'username' => 'require',
            'password' => 'require',
        ]);
        if (!$validate->check($params)) {
            Error($validate->getError());
        }

        $userdata = Db::connect('login')->table('user')->where('username',$params['username'])->where('pass',md5($params['password']))->find();
        if( $userdata ){
            $time = time();
            $singleToken = md5(Request::ip().$userdata['uid']. $time);
            Cache::set($userdata['uid'],$time);
            Session::set('login',$userdata);
            Cookie::set('SINGLETOKEN',$singleToken);
            echo 'Landing successfully';
        }else{
            Error('帐号或密码错误!');
        }
    }

  

验证方法 就是用cookie里的sign 和redis的值对比下

    //验证方法
    function handle()
    {
       $userinfo  = Session::get('login');
       if($userinfo){
            $singletoken  = Cookie::get('SINGLETOKEN');
            if($singletoken){
                $time = Cache::get($userinfo['uid']);
                $ip = Request::ip();
                $secret = md5($ip.$userinfo['uid'].$time);

                if ($singletoken != $secret) {
                    Session::delete('login');
                    exit('您的帐号在另一个地点登录'); 
                }
                //通过验证
                return ;
            }else{
               exit('请先登陆1'); 
            }
            
       }else{
            exit('请先登陆2');
       }
    }

  

然后调用

    public function user()
    {   
        //验证,可以写中间件或者父类 ,我这是demo
        $this->handle();
        echo 'hello world';
    }

  

posted @ 2019-05-14 11:13  bobiscool  阅读(308)  评论(0编辑  收藏  举报