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 を行うことは現実的ではありません。
私の問題に関するヒントやヒントはありますか?