私は、一度に1つのアクティブなセッションしか持たないようにユーザーを制限する必要があるシナリオを持っています。 Mineはrails3アプリケーションであり、認証にdeviseを使用します。最新のユーザーセッションだけをアクティブにすることに興味があります。つまり、同じユーザー名に対して別のセッションがアクティブな間にユーザーがログインした場合、古いセッションを無効にして、最近のセッションを許可したいと考えています。ユーザーのセッションを取得して無効にする方法がありますか?Devise - 同じユーザーが別のブラウザ/マシンからログインした場合にユーザーセッションを無効にする
4
A
答えて
13
特定のユーザーのセッションを追跡するには、そのユーザーに固有の一意のトークンをデータベースに格納します。
トークンを格納するフィールドを追加するための移行を作成します。私は、デバイスモデルがユーザであると仮定します。
class AddSignInTokenToUsers < ActiveRecord::Migration
def change
add_column :users, :current_sign_in_token, :string
end
end
application_controller.rb
class ApplicationController < ActionController::Base
before_filter :invalidate_simultaneous_user_session, :unless => Proc.new {|c| c.controller_name == 'sessions' and c.action_name == 'create' }
def invalidate_simultaneous_user_session
sign_out_and_redirect(current_user) if current_user && session[:sign_in_token] != current_user.current_sign_in_token
end
def sign_in(resource_or_scope, *args)
super
token = Devise.friendly_token
current_user.update_attribute :current_sign_in_token, token
session[:sign_in_token] = token
end
end
sign_in(resource_or_scope, *args)
に次のコードを追加してユーザーがログインするたびに呼び出されます工夫フックです。
invalidate_simultaneous_user_session
別のインスタンスならば、現在のユーザーをログアウトします現在のユーザのログインします。これにより、任意の時点で1つのセッションだけがアクティブになります。
invalidate_simultaneous_user_session
フィルタは、新たにログインしたユーザのトークンを更新するユーザログインアクションのためにスキップする必要があります。 Procを使ってコントローラー名とアクションに基づいてフィルターをスキップするのはうれしいです。既にdevdeのsessions_controller
をオーバーライドしている場合は、コントローラにskip_before_filter :check_simultaneous_user_session
を追加すると、Proc!このことができます
・ホープ..レール4用の更新の工夫については
1
は、 あなたは私はあなたが必要だと思う。この
関連する問題
- 1. ユーザーがHapi.jsでログインしている場合にログインルートを無効にする
- 2. Wordpressユーザーがログインしていない場合はページを無効にする
- 3. ユーザーが同じページにアクセスする場合、URLを無効にすることはできますか?
- 4. ログインしたユーザーに応じてページの一部を無効にする方法
- 5. Deviseを使用せずにログインしたユーザーに別のルートパスを指定する
- 6. ログイン後にdevise sign_upを無効にする
- 7. のCodeIgniter:ログインが同じログインページにリダイレクトする方法を、失敗した場合は、ユーザー名とパスワード
- 8. ユーザーが選択した場合、JQueryデータテーブルのチェックボックスを無効にする
- 9. ユーザーをホームページにリダイレクトするか、ログインしていない場合は送信ボタンを無効にする
- 10. Googleログインは、ユーザーがログインするたびに同じアカウントを使用します。
- 11. Parseユーザーセッションを無効にする
- 12. ソーシャルネットワーク(Google)を使用してユーザーがログインしている場合、Spring Securityを無効にする
- 13. ユーザーがすでにログインしている場合は、同じブラウザのasp.netにリダイレクトするC#
- 14. Deviseエラー:無効なユーザー名とパスワードの場合、/ users/sign_inのI18n :: MissingInterpolationArgument
- 15. 同じPOSTパラメータが同じ場合に、キャッシュからフェッチして出力する
- 16. javascriptが無効の場合、別のページにリダイレクトする
- 17. Deviseユーザーの更新操作を無効にする
- 18. Devise - upgraded_authenticationからのアップグレード後のログイン - 無効なメールまたはパスワードのエラー
- 19. Djangoは、ユーザーが通常のブラウザウィンドウから既にログインしている場合、シークレットブラウザウィンドウからログインします。
- 20. ログインしていない場合、ユーザーを別のページにリダイレクトしますか?
- 21. 別のドメインから同じリソースを要求した場合にのみCORS要求が失敗する
- 22. Rails 3 + Devise + Jquery Mobileのログインに失敗した場合にユーザーにフィードバックはありません
- 23. クッキーは2つの異なるブラウザマシンのクライアントと同じです
- 24. DropDownListForから選択した場合に送信ボタンを無効にする
- 25. Rails - omniauthユーザーのためのDevise '現在のパスワード'を無効にする方法
- 26. ユーザーがログインしている場合にインデックスページをリダイレクトする
- 27. javafxの同じユーザーからの同時ログインを防ぐ
- 28. ユーザーがログインしていない場合は登録ページにリダイレクト
- 29. ログインしていないユーザーのチェックアウトページを無効にする
- 30. Tomcatを使用して同じPCからの同時ユーザーセッションを防止する
に応じてコードを変更することができ、余分な '' '=' '' '' 'c.action_name = 'create''''でアクション名を割り当てずに比較します。私。だからそれは次のようになります: '' 'c.action_name == 'create'''' – ChrHansen
@ChristianHansen残念です..それを修正しました! – dexter
例を見る[ここ](https://gist.github.com/KieranP/9044432) –