マルチテナントを含むSaaS製品用のRESTful APIを構築する方法を理解しようとしています。テクノロジースタックは、SpringとHibernateを使用するJavaであり、WARをTomcatにデプロイします。SpringとHibernateとTomcatを使用してステートレス環境でマルチテナントを実装する
私の主な問題は、アプリケーションがCRUDを実行するときに正しいデータベース接続を使用するために、REST呼び出し内でtenant_idをどのように維持するかです。 Tomcatがスレッドプールを使用し、ThreadLocalを使用すべきでないスレッドを再利用していることが分かります。
私は、slf4jがこれをMDCのロギングの実装でサポートしていると読んでいます。サーブレットフィルタは、tenant_idを最前面に維持し、フィルタの終了時にそれをクリアします。したがって、ロガーはメッセージ内の正しいtenant_idを使用します。
同時に、ThreadLocalを使用すると、状態が暗黙的に追加されるため、ステートレスの原則に反します。
さらに、tenant_idを保持している何らかの種類のContextSessionオブジェクトを作成して渡すという考えは、私の問題を解決してくれないようです。このオブジェクトはDALとDAOのレイヤーに渡され、オブジェクトをロードします。私はこのContextSessionクラスのこの高い結合を避け、多くのメソッドシグネチャにそれを含める必要があります。
ステートレス環境でマルチテナントを実装するにはどうすればよいですか?
ありがとうございました。ですからDAOでは、どのようにしてユーザのtenant_idにSecurityContexを注入しますか?私はその範囲がセッションであると思いますか? –
SecurityContextにアクセスする方法についてはhttp://www.baeldung.com/get-user-in-spring-securityを参照してください。 – httPants
また、SecurityContextは必ずしもセッションスコープである必要はありません。ステートレスセッションでoauth2のようなものを使用すると、リクエストで使用されたトークンはsecuritycontextに格納され、レルム情報(テナントに伝える)が含まれます。 – httPants