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