2015-11-05 49 views
0

我已經在Rails 3.2.17中配置了身份驗證而無需Devise。我想在會話結束後30分鐘後將用戶重定向回登錄屏幕,並讓他們知道會話已結束,並且必須重新登錄。如何檢查會話是否超時並將用戶重定向回登錄屏幕

我試圖添加一個屬性:login_expiry到用戶和設置的時間會話結束時間10分鐘後,在我的會話控制器我已經找到了用戶之後:

user.login_expiry = 40.minutes。 from_now user.save

其中login_expiry是日期時間屬性。

如果用戶會話已結束,並且在會話結束後10分鐘內,則應向用戶提供登錄屏幕和閃光燈「您的會話已結束,請重新登錄」。

但是我發現,login_expiry沒有在用戶對象上更新。數據庫正在回滾。

我真的很想有人幫助!

在此先感謝!

+0

你需要Devise無法處理的東西嗎? http://www.rubydoc.info/github/plataformatec/devise/Devise/Models/Timeoutable – cih

+0

嗨,我決定不設計,因爲我理解認證是如何工作的,將我的代碼拉出來,並將設計比它的價值更麻煩。 –

+0

對不起,我第一次誤讀了這篇文章,我把它看作是「與設計」我的壞! – cih

回答

0

在用戶成功登錄,你可以做以下操作:

session[:user_id] = user.id 
session[:expires_at] = Time.current + 30.minutes 

然後,每一次身份驗證的用戶做一些事情做一些事情,這樣做如下:

if session[:expires_at] < Time.current 
    # sign out and redirect to login page 
end 

通常我們檢查用戶是否登錄在或不在每一頁,在這種情況下,我們可以把它們放在ApplicationController和使用before_action鉤軌控制器。

class ApplicationController < ActionController::Base 
    before_action :check_login_session 

    private 

    def check_login_session 
    if session[:expires_at] < Time.current 
     # sign out and redirect to login page 
    end 
    end 
end 

由於ApplicationController通常是每個控制器的父母,所以每一個控制器之前調用它會check_login_session

+0

嗨sadaf2605,感謝您的答案只是想知道我會在會話超時執行檢查的代碼在哪裏? –

+0

@AndrewFyfe,我已經更新了我的答案。 – sadaf2605

相關問題