[解決済み] railsにおけるThread.current[]の安全性について
質問
に情報を保存することに関して、相反する意見を持ち続けています。
Thread.current
ハッシュ (たとえば current_user, current subdomain, など) に情報を保存することに関して、私は相反する意見を持ち続けています。このテクニックは、モデル レイヤー内の後の処理 (クエリ スコープ、監査など) を簡略化する方法として提案されています。
- Railsでスレッド変数が断続的に表示されるのはなぜですか?
- Rails用APIラッパーでThread.currentを使用する代替案
- Thread.current[]の値やクラスレベルの属性はrailsで使用しても問題ないでしょうか?
多くの人が、MVCパターンを壊してしまうので、この慣習は受け入れられないと考えています。 他の人々は、アプローチの信頼性/安全性についての懸念を表明しており、私の2部構成の質問は、後者の側面に焦点を当てています。
-
は
Thread.current
ハッシュは、その全サイクルを通じて、1つのレスポンスに対してのみ利用可能であり、プライベートであることが保証されていますか? -
私は、スレッドが、レスポンスの終わりに、他の入ってくるリクエストに引き渡されるかもしれないことを理解しています。
Thread.current
. レスポンスの終了前にそのような情報をクリアすることは可能でしょうか (たとえばThread.current[:user] = nil
をコントローラのafter_filter
) を使用すれば、そのようなセキュリティ侵害を防ぐのに十分なのでしょうか?
ありがとうございます。 ジュゼッペ
どのように解決するのですか?
スレッドローカル変数を使用しない特別な理由はありませんが、主な問題点は以下の通りです。
- スレッドローカル変数を使用するコードをテストするときに、スレッドローカル変数を設定することを覚えなければならないので、テストするのが難しい。
- スレッドローカルを使用するクラスは、これらのオブジェクトが 利用可能 でなく、スレッドローカル変数の中にあることを知る必要があり、 この種の間接参照は通常 デメテルの法則
- フレームワークがスレッドを再利用する場合、スレッドローカルをクリーンアップしないことは問題かもしれません (スレッドローカル変数はすでに開始されており、また ||= の呼び出しに依存するコードは失敗するかもしれません。
ということで、全く使えないわけではないものの ベスト アプローチは使用しないことですが、時折、スレッドローカルが非常に多くのコードを変更せずに最も単純な可能な解決策になりそうな壁にぶつかり、妥協して、スレッドローカルの完璧ではないオブジェクト指向モデルを持つか、同じことをするために非常に多くのコードを変更しなければなりません。
もし本当にスレッドローカルの道を進むのであれば、次のような、終了後のクリーンアップを覚えているブロックを使って行うよう、私はきっと助言します。
around_filter :do_with_current_user
def do_with_current_user
Thread.current[:current_user] = self.current_user
begin
yield
ensure
Thread.current[:current_user] = nil
end
end
これは、このスレッドがリサイクルされる場合に使用される前に、スレッドローカル変数がクリーンアップされることを保証します。
関連
-
[解決済み] Railsマイグレーションを利用してカラムをドロップする方法
-
[解決済み] 検索 vs 発見する by vs どこに
-
[解決済み] Ruby on Railsのデータベースをパージまたは再作成する
-
[解決済み] Ruby on Railsのマイグレーションでデータベースのカラムの名前を変更するにはどうすればよいですか?
-
[解決済み] Ruby on Railsで現在の絶対URLを取得するにはどうすればよいですか?
-
[解決済み] エラーが発生しました。pgsqlをrailsで動作させようとすると、Peer authentication failed for user "postgres" と表示されます。
-
[解決済み] Ruby on RailsでJSON出力を "きれい "にフォーマットする方法
-
[解決済み] Rails 4で懸念事項を使用する方法
-
[解決済み】Railsの認証トークンを理解する
-
[解決済み】railsの文字列とtextの違い?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】bundle installが "Could not locate Gemfile "を返す。
-
[解決済み] 新規ユーザー作成時に ActiveModel::ForbiddenAttributesError が発生する。
-
[解決済み] Rubyの文字列から日付への変換
-
[解決済み] Ruby on Railsのランナー
-
[解決済み] PG::ConnectionBad - サーバーに接続できませんでした。接続が拒否されました。
-
[解決済み] Paramが無いか、値が空である。ParameterMissing in ResultsController#update
-
[解決済み] rspecにおけるassignsの意味
-
[解決済み] railsでcheck_boxをcheckedにする方法は?
-
[解決済み] Heroku Error R14 (Memory quota exceeded): How do I solve this?
-
[解決済み] 属性とカラムの違いは何ですか?