2016-07-02 3 views
0

私はRailsを初めて使っています。私はMichael Hartl's Railsチュートリアルに従っていますので、私のコードは主にそこから借りています。ここにシナリオがあります:ユーザがRailsでログアウトした後にすべてのセッションを無効にするには?

私はComputer Aを使用して私のサイトにログオンします。次に、同じユーザーIDを使用してComputer Bを使用してサイトにログオンします。 Computer Aを使用してサイトからログアウトすると、Computer Bはログインしたままで、引き続き操作を実行できます。セキュリティ上の理由から、Computer AがログアウトしたときにComputer Bに再度ログインさせていただきたいと思います。ログアウト時に特定のユーザーのすべてのセッションを無効にする簡単な方法はありますか?非常に感謝するいくつかのサンプルコードがある場合。

また、ログアウト時にreset_sessionを使用することをお勧めします。しかし、ユーザーのログアウト前またはログアウト後にreset_sessionを使用する必要があるかどうか判断するのに問題がありましたか?

これは私のセッションコントローラからです:

def destroy 

    log_out if logged_in? 

    # Reset session to prevent session fixation vulnerability 
    reset_session 

    flash[:info] = "You are now logged out" 
    redirect_to root_url 
    end 

これは私のセッションヘルパーからです:

# Forgets a persistent session 
    def forget(user) 
    user.forget 
    cookies.delete(:user_id) 
    cookies.delete(:remember_token) 
    end 

    # Logs out the current user 
    def log_out 
    forget(current_user) 
    session.delete(:user_id) 
    @current_user = nil 
    end 

答えて

0

彼らが持っているようにそれが仕事です。

セッションはブラウザによって異なります.1台のPCにログインしている場合、セッションは現在作業しているブラウザと同じブラウザに保持されます。別のPCにログインしている場合は、ブラウザが別のセッションを作成します。

googleとFacebookのようなよく知られたサイトでこのシナリオを試すことができます。

以下のリンクを参照してください。

What are sessions? How do they work?

そして、あなたはあなたが試すことができ、単一のマシン内のすべてのセッションを破棄しようとしている場合。あなたがこのことについて行くことができる

rake db:sessions:clear 
0

一つの方法は、データベース上のブール型のカラムされるであろう、のはそれactiveまたはstatusを呼ぶことにしましょう、あなたのユーザモデルにフラグを設定することです。ユーザーがサインアウトすると、アクティブ列がfalseに設定されます。さて、コントローラのcurrent_userメソッドでは、セッションがクリアされていない場合は、ユーザがactiveかどうかを確認するだけです。ここで

は、私はこのために落書きができ少し抜粋です:

class User 
# you should add an active or status column through a migration 
# enum status: {true => :active, false => :inactive} # largely personal preference for enums, you could define other helper methods without needing the enums 
end 

# x_controller 
def log_out 
    ... 
    user.inactive! 
    ... 
end 


def current_user 
    if @current_user ||= User.active.find_by_id(session[:user_id]) 
    # the user is active continue 
    @current_user 
    else 
    # the user is not active clear the session 
    session.clear 
    end 
end 

は、前のコードを試していないが、これは私はあなたがこれを実現することができると思う方法です。

関連する問題