2010-12-17 10 views
3

非常に基本的でなければならないことについて助けが必要です。私はRails 3とAuthlogicを連携させるための優れたチュートリアルに従ってきました。多くの場所で参照されているのと同じ非常に基本的な認証シェルです。しかし、私はちょうどログアウト機能の仕事をすることはできません。私はあらゆる種類のものを試してみました。だから私は助けが必要です。たぶん私は正しく理解していないが、ここでは問題です。Rails/Authlogic - UserSession.destroyはセッションを終了しません。

最後の行:@ user_session.destroyはセッションを終了しません。

詳細: 私はWebサービス上で作業していますので、私は.xml形式の要求と対話しています...そして、私はcURLを使ってテストしています。

私の大きな問題以外はすべて正常に動作します。私はユーザーにデータベースをシードします。

私が最初とcookies.txtログインせずに次の操作を行い、ブランク(またはいくつかの他のユーザーのCookieている) - >

curl -v -H "Accept: text/xml" -X GET --cookie cookies.txt http://localhost:3000/user.xml 

私の要求が予想

として(何のセッションを)拒否していません私がこれを使用してログインしたとき - >

curl -v -H "Accept: text/xml" -X POST -d 'user_session[email][email protected]&user_session[password]=secret' --cookie-jar cookies.txt http://localhost:3000/user_session.xml 

新しいセッションが作成され、私は自分の心のコンテンツに以前のGETを行うことができます。私はログアウト時にすべてが別のユーザーのクッキーが動作しない、クッキーを使用していないことなど

を動作しません使用して、その中で正常に動作するが... ...これを行う - >

curl -v -H "Accept: text/xml" -X DELETE --cookie cookies.txt http://localhost:3000/user_session.xml 

UserSessionsControllerの#破壊アクションは

def destroy 
    @user_session = UserSession.find 
    @user_session.destroy 

respond_to do |format| 
    format.html { redirect_to(:users, :notice => 'Goodbye!') } 
    format.xml { head :ok } 
end 
end 

と呼ばれ、アクション内の行 - user_session.destroy @ @user_session = UserSession.findと が実行されています。エラーもテストもない@user_session =破棄後のUserSession.findは、期待通りにnilを生成します。

HOWEVER ...次回のGETリクエストでは、この同じクッキーが期限切れになるはずです。その特定のユーザーのIDが発生し、情報が配信されます - セッションが存在し続けるかのように!

私は、これは基本的なものですが、完全を期すためにここに私のApplicationControllerに知っている:

class ApplicationController < ActionController::Base 
#protect_from_forgery 
helper_method :current_user_session, :current_user 

private 

def current_user_session 
    return @current_user_session if defined?(@current_user_session) 
    @current_user_session = UserSession.find 
end 

def current_user 
return @current_user if defined?(@current_user) 
@current_user = current_user_session && current_user_session.record 
end 

def require_user 
unless current_user 
    respond_to do |format| 
    format.xml { head :unauthorized } 
    end 
    return false 
end 
end 

def require_no_user 
if current_user 
    respond_to do |format| 
    format.xml { head :bad_request } 
    end 
return false 
end 
end 

@user_session = UserSession.find current_user_session中 - ログアウトユーザーを作成し、永遠にあれば...そうしていきますログイン時に作成された元のCookieが提供されます。

私は何を試してもセッションを終了できません。私はキャッシュヒットが発生するのを見て、ActiveRecordのキャッシュをオフにすることを掘り下げました。キャッシングはオフになり、何も変更されていません。私はこれが私の一部での理解の重大な誤りかAuthlogicで何かを理解しているか、動かないかのどちらかと考えています。

答えて

1

あなたがこれを回避する方法を見つけられなかった場合、セッションレコードは実際には決してクリーンアップされません。これを達成する1つの方法は、cronジョブを使用して定期的にセッションをクリーンアップすることです。

ここで私が役に立ったと評価していたリソースです:Sessions and cookies in Ruby on Rails

あなたは(自動クリーンアップ機能を含む)のユーザーセッションのよりインテリジェントな管理のためにインストールすることができ、プラグインもあります:Zabbaの優れたに基づいてLimited Sessions

+0

ありがとうございました!いいえ、わかりませんでした。私は本当に助けに感謝します。応答遅れて申し訳ありませんが、私は休暇のために遠く離れていました。私は私の検索でRailsのこの「機能」に遭遇していなかったことに驚いています。 –

3

は、答えログアウト時にセッションレコードをクリーンアップするための解決策が出てきました。 Zabbaの答えはうまくいきました。Authlogic内で答えを統合したかっただけです。

このソリューションは非常に簡単で簡単です。私は次の2つのリソースを見つけるまでそれを行う方法は私には分かりませんでした。私は私が探していたものが分からなかったので、私はこれらを早く見つけられなかったと思う。

ログアウト時にセッションをクリアするには - この回答を使用してもうまくいきます。タイムアウトの

Authlogic and multiple sessions for the same user

私はここ二答え使用 -

Ruby on rails - Authlogic : periodically check if user session is valid

を、すべてが偉大な動作しているようです。

関連する問題