私は Devise を使用して自分のウェブサイトをテストしています。私が見つけたのは、Devise のサインアウト後にリダイレクトを傍受した場合、「destroy」メソッドが呼び出されている間に、戻るボタンを使用してシステムに再度ログインできることです。 .
もう少し詳細:
1) 次のオプションで Devise を使用しています。また、sign_out_all_scopes (true) のデフォルト設定を使用しています。
2) Burp Proxy を使用して、サーバーからブラウザに戻ってくる呼び出しを傍受しています。
3)私のセッションコントローラーの破棄方法は次のとおりです。
def destroy
Rails.logger.info "RESETTING SESSION"
reset_session
Rails.logger.info "DESTROYING DEVISE SESSION"
super
Rails.logger.info "DONE WITH DEVISE"
end
ログの呼び出しは私だけのものです。また、reset_session の有無にかかわらず試してみました。
4) ユーザーとしてログインし、ログアウト コールをクリックすると、Web サーバーで Destroy メソッドが呼び出されていることがわかりますが (ログを参照)、ブラウザへのコールをインターセプトします。
5) 戻るボタンをクリックすると、サイトに戻ることができ、ログアウトしたことがないかのようにナビゲートできます。
舞台裏で Warden のログアウトを呼び出しているにもかかわらず、Cookie がブラウザで破棄されない限り、実際には何もしていないように見えます。また、もう少し詳しく見てみると、Devise や Warden がログアウト時にデータベースに対して何もしていないように見えます。つまり、ログアウトしても Cookie を破棄しなくても何の効果もありません。
私は Rails に比較的慣れておらず、Devise にも非常に慣れていないので、何か足りないのでしょうか?
編集: それで、Billy Chen との簡単な会話の後、私は何も悪いことをしていないように見えます。これが Devise/Warden の仕組みです。
ログアウトすると本当にユーザーがログアウトすることを確認したいサイトで、この問題をどのように解決しているのか気になります。ログイン/ログアウト時に更新される User オブジェクトのステータスをスローするのは簡単ですが、現在の設計でそれを行うオプションがない理由が知りたいです (オプションであったとしても)。
編集2:
問題を解決しました。User モデルで :rememberable がオンになっていないにもかかわらず、devise.rb ファイルに「config.use_salt_as_remember_token = true」があり、これを削除すると問題が修正されました。モデルが記憶可能でない場合にその構成を使用する必要がある理由は正確にはわかりませんが、少なくとも問題は解決されています。
編集3:
どうやら私はうそつきです、それは修正されていません。私はげっぷプロキシで応答をインターセプトするのを逃しただけです。再テストでは、これがまだ問題であることを示しています。ユーザーにキーをタグ付けし、ログアウト時に削除することで修正します。ハックですが、問題は解決するはずです。