質問

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

ただし、セッションは Rails では永続的ではないセッション Cookie として実装されます。できます 作る 彼らはしつこいです:

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).

役に立ちましたか?

解決

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

私がやったことは次のとおりです。

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

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

他のヒント

セッション Cookie の存続期間を長くすることは、ほぼ確実に行わないでください。

特にレールを扱っているわけではありませんが、 この記事 「remember me」のベスト プラクティスを説明するために、ある程度詳しく説明します。

要約すると、次のようにする必要があります。

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

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

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

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

レールキャスト #67restful_authentication

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

残りの認証

restful_authentication プラグインには、これを適切に実装しています。

http://agilewebdevelopment.com/plugins/restful_authentication

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

これは、30 日間の永続セッションを作成した 1 人のユーザーの経験を非常によくまとめたものです。

警告:ブログ投稿は 2006 年のものです

http://grahamglass.blogs.com/main/2006/05/rails_sessionsr.html

これは私にとって魅力的に機能しました。

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

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

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

  1. Vendor/plugins ディレクトリに 1 つのファイルを含める
  2. たった 1 行を使用してアプリケーション コントローラーでセッションの有効期限値を設定します

Rails 向けの優れた認証ソリューションを求めるなら、Devise を選ぶでしょう。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top