[laravel]用戶異地登錄后踢掉之前的登錄


不同用戶和服務器之間由一個唯一的session來區分,但是一般情況下不同的session對應的用戶model可以是同一個。

為了實現只能同時在一個地方登陸,可以在用戶的字段里增加一個last_session來表示該用戶model最近登錄使用的session,每當用戶進行了一次登陸操作后,把last_session重置為當前的session。然后增加一個中間件,判斷每個請求使用的session是否是最近登陸的session,如果不是,返回登錄頁面,表示你已經被踢了。同時頁面上也增加一個定時執行的ajax來判斷當前的登錄狀態是否還有效,如果被踢了,提示並且返回登錄頁面。

1)重置last_session

這是登錄時用的函數:

protected function attemptLogin(Request $request) {
    if ($this->guard()->attempt($this->credentials($request), $request->has('remember'))){
        return $this->guard()->attempt($this->credentials($request), $request->has('remember'));
    }
}

登錄的函數在LoginController里,但是在這個函數里重置last_session是沒用的。

return時調用的attempt函數來自這里:

而且是一個只有聲明(???)沒有實現的函數(???)

看一下它在哪些地方使用過:

打開第一個文件,找到這個函數:

注意到下面有個sendLoginResponse函數里面執行了一個session的regenerate,猜測應該是這里產生了一個新的session替換了登錄時使用的那個,於是把last_session的重置寫在這里:

Auth::user()->last_session=Session::getId();
Auth::user()->save();

成功了。

2)中間件

public function handle($request, Closure $next){
    if (Session::getId()!=Auth::user()->last_session){
        if ($request->ajax())return response()->json(['status'=>'guoqile']);
        else return redirect('login');
    }

    return $next($request);
}

3)頁面ajax(和一個讀取新消息的混在一起了)

$(document).ready(function(){
    setInterval("ajaxGetNotify()", 5000)
});
//$(document).ready(ajaxGetNotify());

var title = document.title

function ajaxGetNotify(){
    $.ajax({
        type: 'GET',
        url: 'notification_num',
        dataType: 'json',
        success: function(data){
            var i=0;
            if (data['num'] != undefined) {
                if (data['num'] > 0) {
                    setInterval(function test() {
                        i++;
                        if (i == 1) document.title = '【新消息】' + title;
                        if (i == 2) document.title = '【   】' + title;
                        if (i == 3) i = 0;
                    }, 600);
                }
            }
            if (data['status'] != undefined) {
                if (data['status'] == 'guoqile') {
                    alert('由於賬號在另一地點登錄,您已被迫下線。');
                    location.reload();
                }
            }
        }
    });
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM