私は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コールを行うことは実用的ではない。
誰かが私の問題にヒントやヒントを持っていますか?