57

私の Rails アプリには、"remember me" チェックボックスのあるサインイン ボックスがあります。このチェックボックスをオンにしたユーザーは、ブラウザを閉じた後もログインしたままにする必要があります。ユーザーのセッションにIDを保存することで、ユーザーがログインしているかどうかを追跡しています。

ただし、セッションはセッション Cookie として Rails に実装されており、永続的ではありません。それらを永続的にすることができます:

class ApplicationController < ActionController::Base
  before_filter :update_session_expiration_date

  private

  def update_session_expiration_date
    options = ActionController::Base.session_options
    unless options[:session_expires]
      options[:session_expires] = 1.year.from_now
    end
  end
end

しかし、これはハックのように思えます。これは、このような一般的な機能には驚くべきことです。もっと良い方法はありますか?

編集

Gareth の回答はかなり良いですが、Rails 2 に精通している方からの回答をお待ちしています (ユニークなためCookieSessionStore)。

4

7 に答える 7

29

ほとんどの場合、セッション Cookie を長寿命に拡張するべきではありません。

Rails を具体的に扱っているわけではありませんが、この記事では「remember me」のベスト プラクティスについて詳しく説明しています。

要約すると、次のことを行う必要があります。

  • ユーザー テーブルに余分な列を追加して、大きなランダム値を受け入れる
  • ユーザーIDとランダム値を組み合わせた長寿命のCookieをクライアントに設定します
  • 新しいセッションが開始されたら、id/value Cookie の存在を確認し、一致する場合は新しいユーザーを認証します。

著者はまた、ランダム値を無効にし、ログインごとに Cookie をリセットすることを推奨しています。個人的には、2 台のコンピューターでサイトにログインしたままにできないので、これは好きではありません。パスワード変更機能もランダム値をリセットして、他のマシンのセッションをロックアウトするようにする傾向があります。

最後に、特定の機能 (パスワードの変更/電子メールの変更など) を自動認証セッションで使用できないようにすることについて彼が与えるアドバイスは、従う価値がありますが、現実の世界ではめったに見られません。

于 2008-08-02T16:10:42.817 に答える
13

私はこれについてしばらく考え、いくつかの結論に達しました。Rails のセッション Cookie はデフォルトで改ざん防止になっているため、クライアント側で Cookie が変更されることを心配する必要はありません。

これが私がやったことです:

  • セッション Cookie の有効期間が長く設定されている (6 か月程度)
  • セッションストア内
    • ログイン + 24 時間に設定された「有効期限」の日付
    • ユーザーID
    • Authenticated = true であるため、匿名ユーザー セッションを許可できます (Cookie の改ざん保護のため、危険ではありません)。
  • セッションの「期限切れ」部分をチェックするアプリケーション コントローラーに before_filter を追加します。

ユーザーが「Remember Me」ボックスをチェックすると、session[:expireson] の日付をログイン + 2 週間に設定するだけです。RailsセッションCookieは改ざん防止されているため、Cookieを盗んで永久にログインしたままにしたり、別のユーザーになりすましたりすることはできません.

于 2008-09-16T21:37:36.440 に答える
11

これを実装した RESTful_Authentication プラグインを調べるか、RESTful Authentication_plugin を使用するように実装を切り替えることをお勧めします。このプラグインの使用方法については、Railscasts に適切な説明があります。

railscasts #67 restful_authentication

ここにプラグイン自体へのリンクがあります

restful_authentication

于 2008-09-17T14:17:34.023 に答える
6

restful_authentication プラグインには、これの適切な実装があります。

http://agilewebdevelopment.com/plugins/restful_authentication

于 2008-08-06T21:30:25.180 に答える
5

あなたは彼らのセッションを持続させたくはなく、彼らのアイデンティティだけを維持したいことに注意してください。彼らがあなたのサイトに戻ったときに、あなたは彼らのために新しいセッションを作成します。通常は、GUIDをユーザーに割り当て、それをCookieに書き込んでから、ユーザーが戻ってきたときにそれを使用して検索します。トークンにはログイン名やユーザーIDを使用しないでください。簡単に推測でき、巧妙な訪問者が他のユーザーのアカウントを乗っ取る可能性があります。

于 2008-09-01T21:46:46.840 に答える
4

これは私にとって魅力のように機能しました:

http://squarewheel.wordpress.com/2007/11/03/session-cookie-expiration-time-in-rails/

現在、私の CookieStore セッションは 2 週間後に期限切れになるため、ユーザーはさらに 2 週間永続的にログインするために、ログイン資格情報を再度送信する必要があります。

基本的には、次のように簡単です。

  1. vendor/plugins ディレクトリに 1 つのファイルを含める
  2. 1 行だけを使用して、アプリケーション コントローラーでセッションの有効期限の値を設定する
于 2008-09-20T08:58:47.127 に答える
4

私はレール用の優れた認証ソリューションであるDeviseを選びます。

于 2011-01-16T04:26:53.270 に答える