PHP實現使用者異地登入提醒功能的方法

語言: CN / TW / HK

有時候你的網站賬號被盜或你在別處登入操作後臺時,右下角會彈出提示資訊,提醒你的賬號異地登入,或者會被強制下線。對於這種安全性要求比較高的web網站,很多後臺管理都會做這種功能提醒。

甄別自己的賬號是否被盜或者是否有另一個人此刻登陸了在進行後臺操作,這些都是很不安全的,為了避免兩個人同時登入同時操作,可強制下線一個賬號。我們今天就來講解這個知識點。

當然,通過IP判斷是不行的,因為IP是隨時會在某一個網段內變化的,不過有一個機制,那就是session,恰巧可以解決這個,只要你使用同一個瀏覽器訪問網站,瀏覽器不關閉每個來訪者的session_id是不變的,這也正是解決這個問題需要的。

以TP5.0框架搭建的網站後臺為例;用哪各框架都一樣

(1)修改資料庫使用者表

在user表中,增加一個欄位`session_id` varchar(32),用來存放登入之後的session_id。

(2)使用者登入

使用者登入,就是正常的判斷賬號密碼以及驗證碼,當這些都驗證通過的時候,取出當前的session_id存入資料庫user表中。

(3)解決異地登入問題 對於後臺操作,為了便於驗證和操作安全,基本都會先建立一個公共控制器Common去繼承控制器基類,然後後臺的其他操作控制器都繼承這個公共控制器。對於後臺的每一步操作之前,使用者狀態的檢測都放在Common控制器的__construct構造方法中。

現在在__construct構造方法中,除了驗證使用者登入狀態是否被鎖定等等,還要取出本地session_id和存放在admin表中的session_id進行比對,如果對不上那麼表名賬號在異地有登陸,這時候可以迫使強制下線,退回到登入頁面。程式碼如下:

$user=Db::name('admin')->where('id',session('admin_id'))->find(); 
$session_id = session_id();
if($user['session_id'] != $session_id){
     session_destroy();
     $this->error('登入異常,被迫下線', 'Login/index');
}

效果如下:

Login.php核心程式碼,isGet就顯示登入頁面,不是就進行登入處理操作。

class Login extends Common
{
    public $is_check_login = false;
    public function index(){
        if($this->request->isGet()){
            return $this->fetch();
        }
        //呼叫自定義的方法實現登入
        $model = model('Admin');
        $result = $model->login();
        if($result === false){
            $this->error($model->getError());
        }
    }
}

Admin.php,主要是處理上面login的邏輯與處理方法。校驗等,不返回false就存入session_id

Common.php公共控制器檔案,login繼承公共方法,也就是中介軟體。意味著登入之前優先通過公共方法,此處接收session_id與存在表裡的session_id是否一致,不一致就提醒異地登入,強制下線!

public $is_check_login=true;
public $request;
public function __contruct(Request $req)
{
    parent::__contruct();
    $this->request =$req;
    if(!session('admin_id') && $this->is_check_login){
        $this->error("先去登入",'Login/index');
    }

    if(session('admin_id') && $this->is_check_login){
        $user = "select...." //查詢存在表裡的session_id,然後作比較
        if(session('admin_id') != $user['session_id']){
            session_destroy();
            $this->error("登入異常,被迫下線");
        }
    }
}

整個過程思路實現起來很簡單!其實就是在講sesson_id的一個用法!

以上內容希望幫助到大家,更多PHP大廠PDF面試文件,PHP進階架構視訊資料,PHP精彩好文免費獲取可以關注公眾號:PHP開源社群,或者訪問:

2021金三銀四大廠面試真題集錦,必看!

騰訊一面的Redis秒殺面試題你會麼?

四年精華PHP技術文章整理合集——PHP框架篇

四年精華PHP技術文合集——微服務架構篇

四年精華PHP技術文合集——分散式架構篇

四年精華PHP技術文合集——高併發場景篇

四年精華PHP技術文章整理合集——資料庫篇