2011-07-26 43 views
4

私はMichael Hartl's Railstutorialを使っていますが、私は練習問題9.6.2に固執しています。私はオンラインで検索、私のセッションヘルパーでこのコードを使用:オンラインからRailsでは、ブラウザを閉じたときにどのようにセッションを破棄しますか?

module SessionsHelper 

    def sign_in(user) 

    session[:user_id] = user.id 
    self.current_user = user 
    end 

    def current_user=(user) 
    @current_user = user 
    end 

    def current_user 
    @current_user ||= User.find(session[:user_id]) if session[:user_id] 
    end 

    def signed_in? 
    !current_user.nil? 
    end 

    def sign_out 
    session[:user_id] = nil 
    self.current_user = nil 
    end 
end 

私はそれを見つけた:ブラウザを閉じたときにhttp://www.nimweb.it/web-development/ruby-on-rails-web-development/ruby-on-rails-tutorial-exercise-9-6-2-rails-session/

ただし、ユーザーがログアウトされていません。他の誰かがこれに対する解決策を持っていますか?

答えて

4

EDIT: あなたが与えたリンク、彼らは書き込みを見て:

我々はまた、(「$レール秒」で)サーバを起動し、私たちのブランドの新しいセッションの 機能を確認することができますクッキーなしで(ブラウザを閉じるたびに がログアウトする必要があります)。

(強調追加)

したがって、その解決策は、単に各訪問で作成された新しいセッションで、その結果、クッキーをオフにすることです。彼らは実際には、方程式のサーバー側で古いセッションを削除することについて話していません。

私のオリジナルの答えは、歴史的価値のための下に残っている:


基本的

(これはあまりにも一般的である場合に謝罪、私はあなたがより大きな絵を見ていないと仮定しています)、ウェブプルベースのモデルを使用します。クライアントはサーバー上で操作を要求します。

セッションを閉じることは、クライアントがサーバーから要求しなければならないアクションです(たとえば、ログアウトすることによって)セッションを閉じることを強制することはできません。

したがって、通常、セッションには定期的にチェックされるタイムアウト期間があります。各セッションにはデータベースに格納されている「開始時刻」があり、古すぎるセッションはパージされます。

JavaScriptがブラウザのクローズイベントを検出し、セッションを閉じるための何らかのベストプラクティスを試みる方法があるとも言われています。しかし、ユーザーはブラウザプロセスを強制的に強制終了して、サーバーを完全に暗闇の中に残すという保証はありません。

要するに、セッションを閉じるためにクライアントに頼ることはできません。おそらく、タイムアウトが最善の選択肢です。

+1

Expiresオプションが指定されていない場合、ブラウザーが閉じられると(ほとんどのユーザーエージェントで)Cookieが期限切れになります。 –

+0

良い点 - 明らかであるにもかかわらず、古いセッション(サーバーの視点から)を閉じないだけで、次回に新しいセッションを開くようにします。 – jwd

1

まず、「混乱」を避けるために使用しているセッションストアをクリアすることです。 私はこの演習でデフォルト(クッキー)ストアを使用していますが、すでにアクティブレコードストア(またはサーバー上のデータを保持する他のストア)に変更している可能性があります。

config/initializers/session_store.rbファイルを確認して、使用しているセッションストアを確認してください。 ストアについて何も変更していないと仮定すると、:cookie_storeに設定する必要があります。クライアント側のクッキーがセッションデータを保存するために使用され、デフォルトでブラウザが閉じられた後に失効するため、彼らはいわゆる「セッション」クッキーと呼ばれています。ここでのクリアセッションは、ブラウジングセッションが持続するまで存在するクッキーを参照します。ブラウザを閉じるとセッションクッキーが削除されます。 もちろん、ブラウザの終了時にsign_outsession.destroyなどのサーバー側のコードは呼び出されませんが、Cookieはすべてのセッションデータを保持し、アクセスできないブラウザによって削除されるため、セッションが破棄される可能性があります。 ..

サーバー側のセッション記憶域では、前の回答で述べたように、これはもっと複雑になります。"クライアントにセッションを強制的に閉じることはできません"。 ほとんどの人は、「期限切れの」セッションを手作業で破壊します。 http://guides.rubyonrails.org/security.html#session-expiry。レーキタスクの例https://gist.github.com/kares/919069

0

私はこの素晴らしいチュートリアルを今読んでおり、約30分前に同じ課題に遭っています。 Jeremy Romanがこのスレッドの質問に正確に答えました。彼はステップバイステップの答えを提供しなかったが、彼が言及したことは、私が答えを理解することを可能にした。今

ジェレミーは、ブラウザが閉じられた後に自動的に期限切れにされているセッションについて言及したものを考えると...具体的には、対応するクッキーのために指定された属性を「有効期限」、溶液は次のように関連しているがない限り、コードのチャンク:tutorial itself 1として

app/helpers/session_helper.rb:

def sign_in(user) 
    cookies.permanent.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
end 

、上記20.years.from_nowに '有効期限' のクッキーの属性を設定してpermanent方法。つまり、明示的にログアウトしたり、クッキーを削除したりしない限り、セッションは20年間持続します。

ので、ブラウザを閉じたときにセッションを期限切れにするために、あなたは単にpermanentを省略することに帰着する任意の有効期限、なしで、あなたのクッキーを作成する必要があります。

app/helpers/session_helper.rb:

def sign_in(user) 
    cookies.signed[:remember_token] = [user.id, user.salt] 
    self.current_user = user 
end 

ものの他の有効な解決方法があるかもしれませんが、それはまだわかりません(私はちょうどRailsを学び始めたばかりです)。は非常にです。あなたは何も書く必要はありません - ちょうどpermanentを削除してください! :)

2

私はチュートリアルの中で同じ演習で立ち往生しました。 Firefoxを使用してタブを保存して終了することにした場合、ブラウザを再起動すると、ブラウザは明らかにすべてのセッションデータを保存します。これは、セッションクッキーに保存されたユーザー情報も復元されるため、ブラウザーを閉じた後にユーザーがログインしたように見えることを意味します。私は他のブラウザ(例えばクロム)は同じ種類の行動を持っているとは思わない。したがって、迅速なテストは、別のブラウザを使用してコードが機能するかどうかを確認することです。お役に立てれば。

+0

私は自分のChrome(ver.20)をテストしましたが、それを閉じた後もセッションは維持されます。 – lulalala

0

私はこの回答が4年余りになっていることを知っていますが、私は同じ問題に遭遇しました。それは様々な形で何度も尋ねられました。私が見つけた唯一の正解はhereでした。

問題は、問題の設計ではありません。もちろん、クッキーをオンにしてこの演習を完了することが期待されます。むしろ、問題はブラウザの設定にあります。つまり、ブラウザを起動するときに「前回のウィンドウとタブを開いています」または「前回のウィンドウとタブを開く」です。この設定では、ブラウザーが閉じてもセッションが生き続けるようになります。これはまったく望ましくない動作です。

この問題は、チュートリアル(第8章注2)の脚注として参照されます。作者は、このブラウザの設定とそれに付随する終わりのないセッションに関して、

...もちろん、この動作は制御できません。

関連する問題