0

Java、Spring、Struts2、および Hibernate でマルチテナント SaaS Web アプリケーションをマルチングしています。少し調査した後、共有データベース、共有スキーマ、共有テーブルのアプローチでマルチテナンシーを実装することにしました。そして、各 db-line に tenantId をタグ付けします。

アプリケーションを書き直したので、マネージャーと Dao は tenantId をパラメーターとして受け取り、正しい db リソースのみを提供します。

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

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

それならそれでいいのですが、編集フォームを送信するときはどうですか?ユーザーがリクエストを変更し、非表示フィールドをいじってobjectId、アクションがユーザーのテナントに属していないオブジェクトを変更するリクエストを受け取るとどうなるでしょうか。

または、ユーザーが削除アクションの URL を変更した場合/delete?objectId=x

基本的に、ログインしたユーザーが何をしようとしてもアクセスできることを保証する何らかの方法が必要です。誰でも簡単に取得できます。where句にtenantIdを入れるだけです。しかし、更新と削除については、どの方向に進むべきかわかりません。

更新と削除のたびにデータベースにクエリを実行して、ユーザーがオブジェクトにアクセスできるかどうかを確認できますが、データベースとのやり取りを最小限に抑えようとしています。そのため、そのようなアクションごとに余分な db-call を行うことは現実的ではありません。

私の問題に関するヒントやヒントはありますか?

4

2 に答える 2

0

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

この場合、最初にクエリのパフォーマンスを低下させ、次に更新を実行したくありません。条件付きでデータベースを更新できるので、それで問題ありません。あなたの場合、これはデータベースレベルである可能性が高いため、データベースの機能を知る必要があります(一度に行うには)。たとえば、oracle には merge ステートメントがあります。

于 2012-05-25T07:40:51.510 に答える