web-dev-qa-db-ja.com

私とセッションを覚えて工夫

私はdevise gem config設定と混同しています:

  # The time the user will be remembered without asking for credentials again.
  config.remember_for = 2.weeks

  # The time you want to timeout the user session without activity. After this
  # time the user will be asked for credentials again.
  config.timeout_in = 10.minutes

ユーザーに[Remember Me]チェックボックスをオンにしたい(つまり、ログインしたままにする)必要がありますが、デフォルトのセッションタイムアウトは10分です。 10分後、「Remember me」をクリックしたにもかかわらず、再度ログインするよう求められます。これが真の場合、remember_forは本当に意味がありません。明らかにここに何かが足りません。

42
Arthur Frankel

timeout_inは、非アクティブになってから10分以内に自動的にログアウトし、remember_meチェックボックスとは互換性がありません。どちらか一方を使用できますが、両方を使用することはできません。

17
Ryan Bigg

デフォルトのDevise gemは:rememberableオプションと:timeoutableオプションの両方をサポートしていないという点でRyanは正しいです。ただし、Rubyのすべてのものと同様に、他のコーダーが行った決定が気に入らない場合、特にほとんどのユーザーが期待するであろう標準から逸脱している場合は、単にそれをオーバーライドできます。

(拒否された) pull request のおかげで、Devise構成ファイル(/config/initializers/devise.rb)の先頭に次のコードを追加することで、この動作を上書きできます。

module Devise
  module Models
    module Timeoutable
      # Checks whether the user session has expired based on configured time.
      def timedout?(last_access)
        return false if remember_exists_and_not_expired?
        last_access && last_access <= self.class.timeout_in.ago
      end

      private

      def remember_exists_and_not_expired?
        return false unless respond_to?(:remember_expired?)
        remember_created_at && !remember_expired?
      end
    end
  end
end

これにより、両方のオプションを構成して、期待どおりに機能させることができます。

config.remember_for = 2.weeks
config.timeout_in = 30.minutes
28
douglasr

以前の回答の情報は古くなっています。私は自分のプロジェクトをテストしました。プロジェクトはRails 4Devise 3.5.1デバイスコードもチェック を使用して確認しています。

Remember Meチェックボックスがチェックされたかどうかを確認します。

  • yesの場合、if remember_exists_and_not_expiredをチェックするため、基本的にはセッション管理にconfig.remember_forを使用します

  • noの場合、if last_access <= timeout_in.agoを使用してconfig.timeout_inをチェックします。

9