私のアプリにはUser
モデルがあり、rememberable_token
列があります。ユーザーを作成すると、ランダムなセキュア文字列がフィルターに保存されbefore_create
、ユーザーのセキュア トークンとして機能します。
user.rememberable_token = SecureRandom.urlsafe_base64
logout
セッション コントローラーでは、そのトークンの値を使用して永続的な Cookie を作成し、ユーザーがブラウザーを閉じてもログアウトされず、アクションを介してログアウトした場合にのみログアウトされるようにします。
セッションコントローラー:
def create
.
.
cookies.permanent.signed[:permanent_user_session] = user.rememberable_token
end
def logout
cookies.delete :permanent_user_session
redirect_to root_url
end
Cookie は、現在のユーザーが存在するかどうかを判断するためにアプリケーション コントローラーで使用されるほか、いくつかのコントローラーでユーザーがログインして認証されているかどうかを判断するために使用される before_filter で使用されます。
アプリケーションコントローラー:
def current_user
@current_user ||= User.find_by_rememberable_token(cookies.signed[:permanent_user_session]) if cookies.signed[:permanent_user_session]
end
def authorize
unless User.find_by_rememberable_token(cookies.signed[:permanent_user_session])
render :action => 'login'
end
end
問題は、これが安全なのか、それともセッション ハイジャックされやすいのかということです。ハイジャックされやすい場合、session#logout
メソッドで、既存の Cookie を削除する直前にユーザー用の新しい rememberable_token を作成した場合 (ただし、その値で新しい Cookie を作成しない場合) は問題ありませんか?
ありがとうございました。