原理:同一賬號在多個設備上登錄,前者被後者頂下線;假設賬號在設備A登錄,該賬號又在設備B登錄,此時設備A登錄的賬號被頂下線
思路分析
1、用户登錄成功後將當前時間存入session中,以及製作個token值存入該用户數據庫中;
2、在驗證用户是否登錄的模塊中,若用户已登錄,將用户數據庫中的token取出,並且製作一個最新的token,兩者判斷是否相等,若不相等,用户下線;
代碼實現
1、在登錄成功的代碼模塊下操作;
// 登錄驗證
$user = DB::table('user')->where(['username' => 賬號, 'password' => 密碼])->first();
if ($user) {
# 登錄成功
$time = time();
$token = md5($user['id'].$time); // 製作 token 用md5加密
DB::table('user')->where(['id'=>$user['id']])->update(['token' => $token]);//將token存入當前用户數據中
session(['token_time'=>$time]);//將當前時間存入session中
session(['user'=>$user]);//將用户信息存入session中
} else {
# 登錄失敗邏輯處理
}
2、在判斷用户是否已經登錄的代碼模塊下操作;
$userInfo = session('user');//從session中獲取用户信息
if ($userInfo) {
# 存在用户信息
$token_time = session('token_time');//從session中獲取time
$last_token = md5($userInfo['id'].$token_time);//製作當前的token值
$token=DB::table('user')->where('id', $userInfo['id'])->value('token');//獲取該用户數據中的token
if($last_token!=$token){
//若當前的token值與數據中的token值不相等,則將用户信息清空,用户被頂下線
$userInfo=null;
}
}else{
# 不存在用户信息邏輯處理(跳轉到登錄界面)
}
最後
覺得文章不錯的,給我點個贊哇,關注一下唄!
技術交流可關注微信公眾號【GitWeb】,加我好友一起探討
微信交流羣:加好友(備註思否)邀你入羣,抱團學習共進步