2016-03-18 8 views
0

マルチユーザのRails 4.2アプリケーションでは、ユーザがログインするときにユーザトークンを保存する必要があります。ここでは2つの方法をルビー糸でUserモデル:ログインユーザーは、彼/彼女のトークンが@user.current_token = tokenによって割り当てられた場合Rubyスレッドを使用したマルチユーザのRailsアプリケーションにユーザトークンを保存

class User < ActiveRecord::Base 
    def self.current_token=(token) 
    Thread.current[:current_token] = token 
    end 

    def self.current_token 
    Thread.current[:current_token] 
    end 
end 

(トークンが生成されていると仮定)。後期アプリで、current_tokenUser.current_token

によって取得することができ、私はスレッドをルビーに新しいですし、確認するために物事のカップルがあります。

1. is token above thread safe and will never be changed (by another user, or overwritten by another user's token) during the `@user`'s session lifetime? 
2. is `User.current_token` available everywhere inside the Rails app (as long as `User` is accessible)? 

答えて

1
  1. スレッドローカルな書き込みはスレッドセーフですが、私はそれが決して変更されないことに数えません。一部のサーバーは、要求が完了した後にスレッドのローカルをクリアします。参照してください:https://github.com/puma/puma/blob/61294479b2f77a838f0d91064ca6d4ed5ba4b9ff/lib/puma/thread_pool.rb#L48
  2. User.current_tokenは、定数Userが読み込まれるアプリのどこでも利用できます。

トークンの格納にはこの方法をおすすめしません。トークンを明示的に渡すことをお勧めします。テストへ

  1. 簡単
  2. コードについて推論する方が簡単です(あなたは、Userクラスのローカルスレッドをスタブアウトする必要がいけない):これは、コードになります。あなたはトークンがどこから来ているのか正確に知っています。私たちは、セッション中にトークンを渡そうとしました、予期しない奇妙なスレッドのバグ
+0

しにくい

  • 。しかし、MVCモデルはセッションでの使用を推奨していません。 – user938363

  • +0

    私はあなたがここで達成しようとしていることについてもう少し理解する必要があります。この場合、トークンを格納する目的は何ですか? – ianks

    +0

    Webサーバが独自のスレッドローカルをクリーンアップし始めるのは悪いことです。トークンは、ユーザーをグループからグループに区別するために使用されます(会社と言う)。ユーザー固有のものではなく、グループ固有のものです。トークンは、特定のグループに属するモデルの情報を検索するために使用されます。 – user938363