2012-05-09 8 views
0

私はJava、Spring、Struts2、およびHibernateのマルチテナントSaaS Webアプリケーションをマルチプレイしています。少しの研究の後、私は、共有データベース、共有スキーマ、共有テーブルアプローチでマルチテナントを実装することを選択します。テナントIDで各db-lineにタグを付けます。複数のテナントSaaSアプリケーションを保護する

私はアプリケーションを書き直しています。そのため、マネージャとDAOはテナントIDをパラメータとして使用して正しいdb-resourceだけを提供します。

これは、情報を取得するときに、すべてのビューに最適です。また、新しいものを作成するため(ログインしたユーザーのテナントIDを使用して情報を保存する)

しかし、更新や削除のためにアプリケーションを保護する方法がわかりません。 例:ユーザーがオブジェクトを編集する場合、URLは次のようになります。/edit?objectId=x これはIdでこのオブジェクトを取得するアクションにマップされます。任意のオブジェクトをurl-modificationで見ることができます。 これは私がDaoにtenantIdを追加することで解決できます。ユーザーがテナント外のオブジェクトを表示しようとすると、何も得られません。

これでokですが、編集フォームで送信するとどうなりますか? ユーザーが要求を変更して、隠しフィールドobjectIdを混乱させると、アクションはユーザーの借用に属さないオブジェクトを変更する要求を受け取ります。

やユーザーのURLは、変更する場合は削除アクション/delete?objectId=x

Basicly私がログインしているユーザーは、彼がやろうとしているものは何でもへのアクセスを持っていることを保証するいくつかの方法が必要です。すべてのgetのための簡単です。 tenantIdをwhere句に入れるだけです。 しかし、私は更新と削除のためにどの方向に行くのかは分かりません。

すべての更新のためにdbにクエリを実行して、ユーザーがオブジェクトにアクセスできるかどうかを確認できますが、db-interactionを最小限に抑えようとしています。だから私はそのようなすべてのアクションのために余分なDBコールを行うことは実用的ではない。

誰かが私の問題にヒントやヒントを持っていますか?

答えて

0

読み込み用に同じものが書き込み/更新に適用されます。ユーザーは、自分が所有するもののみを表示/アクセス/変更することができます。あなたの質問は、データベースについてのことです。データの表示に適用するのと同じ制約をデータの書き込みにも適用する必要があります。

この場合、クエリのパフォーマンスを最初に身に着けてから更新したくありません。条件付きでデータベースを更新できるので、これは問題ありません。これはデータベースレベルである可能性が高いので、あなたのデータベースが何をすることができるかを知る必要があります。たとえば、oracleにはmerge文があります。

関連する問題