单用户登陆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'; }