2017-09-28 158 views
0

當我使用按鈕註銷時,我更新用戶表中的屬性(isActive)。一切都有效,除非一生結束。 爲什麼?After LifeTime - Session.php自動註銷

使用此數據是完全信息。所以一個簡單的發展不僅僅是好的。

謝謝

session.php文件

/* 
|-------------------------------------------------------------------------- 
| Session Lifetime 
|-------------------------------------------------------------------------- 
| 
| Here you may specify the number of minutes that you wish the session 
| to be allowed to remain idle before it expires. If you want them 
| to immediately expire on the browser closing, set that option. 
| 
*/ 

'lifetime' => 120, 

'expire_on_close' => false, 

AuthenticateUsers.php

public function logout(Request $request) 
{ 
    User::where('id', Auth::user()->id)->update(['isActive' => '0']); 

    $this->guard()->logout(); 

    $request->session()->invalidate(); 

    return redirect('/login'); 
} 

回答

1

我真的不明白你的問題,但這裏是我的嘗試給你提示發生了什麼。

你的理解我認爲,當終身時間過去時,客戶可能已經不在您的網站了很長時間,所以沒有什麼特別的事情會發生。將不會對客戶端採取任何措施,也不會對服務器採取任何措施。簡單地說,因爲沒有辦法檢測並且沒有(簡單)的方式來執行沒有關聯請求的代碼。

發生的唯一情況是,在下一次使用該cookie的請求中,可能發生或可能不會發生,laravel會檢測到生命週期已過,並將cookie視爲無效(並將相關請求視爲非loggued請求)

當用戶明確要求斷開連接時,將調用您的註銷路由。當會話失效時,它不會被神奇地調用,因爲laravel沒有檢測到會話失效而沒有從該會話獲得請求。同樣,一旦(如果)失效被檢測到,laravel將不會調用註銷路由,因爲用戶將已經註銷(會話無效,因此數據不能被信任和使用)。

你想要做什麼的方法是存儲用戶的最後一個動作(也就是說,更新它的時間,他做了一個請求),並認爲所有用戶都是非活動的,最後一個動作超過X分鐘前。請注意,這是非常不可靠的,但這是一個相當不錯的估計。

如果你真的想要某種可靠的方式,請看看這個問題:Detect user exit site但請注意,輪詢用戶會定期對您的服務器的性能成本非常高。

+0

非常感謝,很好的解釋! 對不起,我的英語...... –

0

究竟失敗?生命期會話到期時users -table是否未更新?

這是因爲這會通過設置會話cookie的生存期自動發生。當cookie過期時,這不會在您的應用中調用logout路由,也不會更新users -table。

我認爲實現這一目標的唯一方法是將壽命設置爲非常高的分鐘數(例如,99999999 =>190 years)並且「強制」用戶點擊註銷按鈕。 但是用戶仍然可以關閉瀏覽器窗口並退出應用程序。

+0

好的解決方案.... 我必須明白,如果它真的值得或研究另一種解決方案! 謝謝! –