私は、一度に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. ログインしたユーザーに応じてページの一部を無効にする方法
- 3. Googleログインは、ユーザーがログインするたびに同じアカウントを使用します。
- 4. ログイン後にdevise sign_upを無効にする
- 5. 同じPOSTパラメータが同じ場合に、キャッシュからフェッチして出力する
- 6. ユーザーがすでにログインしている場合は、同じブラウザのasp.netにリダイレクトするC#
- 7. javascriptが無効の場合、別のページにリダイレクトする
- 8. Deviseエラー:無効なユーザー名とパスワードの場合、/ users/sign_inのI18n :: MissingInterpolationArgument
- 9. 別のドメインから同じリソースを要求した場合にのみCORS要求が失敗する
- 10. Devise - upgraded_authenticationからのアップグレード後のログイン - 無効なメールまたはパスワードのエラー
- 11. ユーザーがログインしている場合にインデックスページをリダイレクトする
- 12. ユーザーがログインしていない場合は登録ページにリダイレクト
- 13. Rails 3 + Devise + Jquery Mobileのログインに失敗した場合にユーザーにフィードバックはありません
- 14. Tomcatを使用して同じPCからの同時ユーザーセッションを防止する
- 15. JS:selectがデフォルト値の場合、チェックボックスを無効にしますか?
- 16. ユーザーが利用規約に同意しない場合に閉じるボタン
- 17. クッキーは2つの異なるブラウザマシンのクライアントと同じです
- 18. Devise - ログイン中にユーザーを登録
- 19. 同じAppleアカウントでもアプリケーション内のユーザーアカウントが異なる場合の復元IAPを無効にする
- 20. Devise invitable:表示を無効にする
- 21. ユーザーがログインしたことをアプリケーションコントローラに知らせる方法(ユーザーはdeviseで処理されます)
- 22. ログインしているユーザーがプロフィールの所有者である場合に、プロフィールページに別のコンテンツを表示する
- 23. 入力が空の場合にボタンを無効にします。
- 24. ユーザが別のブラウザにログインしたときに、あるブラウザでユーザセッションを無効にしますか?
- 25. 特定のデータが同じ場合に行を結合する
- 26. $無効の場合は無効にするボタン角度
- 27. railsにログインしているユーザーをdevise gemで表示する
- 28. 同じサイトに複数のユーザーがログインするためのC#アプリケーション
- 29. テキストボックスを無効にするユーザーが間違ったパスワードを3回入力した場合
- 30. Rails 3、ユーザーがログインしている場合にのみ部分的レンダリング
に応じてコードを変更することができ、余分な '' '=' '' '' 'c.action_name = 'create''''でアクション名を割り当てずに比較します。私。だからそれは次のようになります: '' 'c.action_name == 'create'''' – ChrHansen
@ChristianHansen残念です..それを修正しました! – dexter
例を見る[ここ](https://gist.github.com/KieranP/9044432) –