Devise: rememberable means that last_sign_in_at is not updated by trackable
、それらの問題は通常、ユーザーがサインインすると、彼らは「二回のログイン」になるということでしょう。 last_sign_in_at
をcurrent_sign_in_at
と同じ(またはほぼ同じ)値に設定します。 私のサイトでは、last_sign_in_at
を使用して、前回の訪問時から何が起こったのかをユーザに知らせるため、やや正確である必要があります。また、+1ログイン回数を記録します。
また、ブラウザーウィンドウを閉じずに数日間ブラウザウィンドウを開いたままにする(したがって、セッションフラグをクリアしない)人がいます。メトリックなどの場合、このようなユーザーの動作によって時々current_sign_in_at
時間がリフレッシュされると便利です。
以下の亜種がこれらの問題を改善します。しかし
class ApplicationController < ActionController::Base
before_filter :update_sign_in_at_periodically
UPDATE_LOGIN_PERIOD = 10.hours
protected
def update_sign_in_at_periodically
if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
session[:last_login_update_at] = Time.now
sign_in(current_user, :force => true) if user_signed_in?
end
end
end
、私が考案3.2.4を使用して、上記を試したとき、私はクッキーによってそれ自動ログインは(ログイン回数+1とcurrent_sign_in_at
が設定されている)新しいログインを入手できます。だから、セッションを開いたままにしているユーザであっても、定期的にトラッキングを更新したいという問題が残っています。
class ApplicationController < ActionController::Base
before_filter :update_sign_in_at_periodically
UPDATE_LOGIN_PERIOD = 10.hours
protected
def update_sign_in_at_periodically
# use session cookie to avoid hammering the database
if !session[:last_login_update_at] or session[:last_login_update_at] < UPDATE_LOGIN_PERIOD.ago
session[:last_login_update_at] = Time.now
if user_signed_in? and current_user.current_sign_in_at < 1.minute.ago # prevents double logins
sign_in(current_user, :force => true)
end
end
end
end
before_filterはいつ呼び出されますか?私はそれぞれの要求には期待していませんが、そのセッションの初めての認証の前にのみですか?また、愚かな質問が、どこにbefore_filterを追加するのですか?私はそれをDeviseユーザーモデルに追加しようとしましたが、未定義のbefore_filterメソッドがありました。 –
これは、各リクエストで実行されます。より良い解決策を実装する前に解決するかどうかを確認するのは、すばやく/汚れたデバッグステップでした。それをグローバルにしたいなら、それをどんなコントローラ、ApplicationControllerにも追加できるはずです。 – RobH
こんにちはロブ、これは私が最後に行ったことです。a)ユーザがsign_inを強制する前にログインしていることを確認し、b)sign_in(強制)メソッドがセッションごとに1回だけ実行されるようにします。(言い換えれば、改行の代わりに、コメントは改行を許さない) 'before_filter proc {if user_signed_in? &&セッション[:logged_signin]; sign_in(current_user、:force => true);セッション[:logged_signin] = true; end} ' –