Rails アプリケーションでの「Remember me」の実装
-
08-06-2019 - |
質問
私の 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 週間ログインし続けるためには、ユーザーはログイン資格情報を再度送信する必要があります。
基本的には次のように簡単です。
- Vendor/plugins ディレクトリに 1 つのファイルを含める
- たった 1 行を使用してアプリケーション コントローラーでセッションの有効期限値を設定します
Rails 向けの優れた認証ソリューションを求めるなら、Devise を選ぶでしょう。