1

ログインしているユーザーに応じて、データベーステーブル名がそれぞれ変更され、Webサーバーと通信するためのクラス変数を設定する必要があるシステムがあります。に変更、それはユーザー文書です。Ruby on RailsスレッドセーフクラスWebサービスへのアクセスのための変数

グローバル変数のようなユーザークラス変数はスレッドセーフですか?システムを使用する多くのユーザーが間違った場所に物事を保存するチャンス?

私はちょうどセッションのキーを設定し、クラス変数を使用しないように必要なスレッドの安全のためにConfiguracaoクラス

def set_variables 
    if current_usuario 
     session[:seller_document] ||= current_usuario.documento 
     Configuracao.logged_in_document = current_usuario.documento 
    end 
end 
+0

Configuracao.logged_in_documentはスレッド安全ではない可能性があり - 。これがためだけのセッター/ゲッターであるあなたが –

+0

それを実装した方法によって異なります –

答えて

1

このようにクラス変数を使用するのはスレッドセーフではありません。あなたは地元のスレッド(すなわちThread.current[:some_key])を使用することができますが、一般的に、これは私には、設計のにおいのように感じている

+0

問題は、データベースの選択ごとに、私はエンタープライズコードを設定する必要があり、各テーブルにはそのレガシーシステムインテグレーション...私はすべての要求にクラスレベルを設定する必要があります。 –

+0

これはおそらくそれを解決する可能性がありますか? –

1

を埋めます。

セッションオブジェクトはCookieであるため、訪問ごとにCookieがクリアされた場合、セッションオブジェクトは特定の1つの特定のセッションにのみ固有のものです。したがって、サイトにアクセスしてWebサービスとして使用する別のアプリケーションは、そのCookieを取得します。

通常、フィルタ前のアプリケーションでは、「ユーザー」にログインし、ユーザーの資格情報でセッションを設定します。したがって、認証資格情報を提供することによってサービスにアクセスするアプリケーションに「ログイン」する必要があります。これは、seller_documentが常に設定されていることを確認するのに適しています。

ここでは、特にフォークプロセスではないため、マルチスレッドで問題はありません。

RailsアプリケーションがWebサービスであることは完全に正常です。標準のRailsアプリケーションに必要な通常のセキュリティおよび開発の検討事項を特に考慮する必要はありません。

+0

私はこのhttps://github.com/steveklabnik/request_storeを見つけた可能性がありますか? –

関連する問題