5

私はこれについて考えすぎましたが、明らかに正しい解決策はありません。これはまさに木には木が必要な状況かもしれないので、stackoverflow の助けが必要です。

地域ベースでデータベース フィルタリングを適用しようとしています。私のシステムにはさまざまなユーザーがいて、それぞれが地域オフィスに割り当てられています。ユーザーが地域のオフィスに関連付けられているデータのみを表示できるようにしたい。

簡単に言えば、私のアプリケーションは次のとおりです。Java App -> JPA (hibernate) -> MySQL

データベースにはすべての地域のオブジェクトが含まれていますが、ユーザーが自分の地域のオブジェクトを操作できるようにしたいだけです。私はそれを行う次の方法について考えました:

1) すべてのデータベース クエリを変更して、select * from tablex where region="myregion" のように読み取るようにします。これは厄介です。JPA ではうまく機能しません。たとえば、entitymanager.find() メソッドは主キーしか受け入れません。もちろん、ネイティブに移行することもできますが、select ステートメントを 1 つ見逃すだけで、セキュリティが失われます。

2) mysql プロキシを使用して結果をフィルタリングします。ちょっとファンキーですが、mysql プロキシは生の呼び出しを見るだけで、それらをどのようにフィルタリングする必要があるか (つまり、この要求を行ったユーザーがどの地域に属しているか) を本当に知りません。わかりました、各リージョンのプロキシを開始できましたが、少し面倒になり始めました..

3) リージョンごとに個別のスキーマを使用します。ええ、簡単です。私は春を使用しているので、RoutingDataSource を使用して、正しいデータソース (スキーマごとに 1 つのデータソース) を介してリクエストをルーティングできます。もちろん、現在の問題は、地域やその他のカテゴリでフィルタリングしたいということです。おっと。

4) ACL - これについてはよくわかりません。select * from tablex; を実行した場合。アクセスできないオブジェクトを静かに除外しますか、それとも大量のアクセス例外がスローされますか?

しかし、私はこれについて考えすぎていますか?これは本当によくある問題のようです。私が愚かすぎて見ることができない簡単な解決策があるに違いありません。できるだけソースに近いものをフィルタリングしたいので、/ またはデータベースに近いものになると確信していますが、何ですか?

ネタバレではありません - リンク、キーワード、アイデア、商用/オープンソース製品の提案をいただければ幸いです!! ありがとう。

4

4 に答える 4

1

私はここ数週間、会計パッケージへの階層的な複数の会社の拡張のために、同様の何か(MySQLと話しているREALbasic)を実装してきました。

SQLステートメントを構成する既存のコードが大量にあるため、それに対応し、各テーブルに制限が適切に含まれていることを確認するために多くの監査を行う必要がありました。1つの落とし穴は、ルックアップテーブルが通常プライマリテーブルと組み合わせてのみ使用される関連ルックアップでしたが、一部のメンテナンスGUIでは、ルックアップテーブル自体を直接ロードしていました。

Acme Pornstarsが会社のある部門のクライアントであることを明らかにするなど、暗黙の情報を提供する危険性があります;-)

その部分の唯一の解決策は、すべての暗黙の関係と多くの監査およびgrepingソースコードを示すDBダイアグラムの非常に注意深い構築であり、追加の制限を必要としないとしてOKであった領域を示すために注意深いコメントを付けました。

これを将来より一般化するために私が思いついた1つのパターンは、明示的なregion = currentRegionVarタイプの検索ではなく、グローバルCurrentEntityForRole( "blah")関数によって提供される任意のentityIDを使用することです。

この抽象化により、一部のデータの共有と、他の制限境界を表す疑似エンティティの実装が可能になります。

JavaとSpringについて十分に理解できませんが、ビューを使用して単一キーのルックアップを提供する方法はありますか?ビューはリージョンフィルターによって制限されていますか?

集計と可能なデータ共有を提供したいという願望が、別のデータベースルートをたどらなかった理由です。

于 2009-01-12T08:49:51.467 に答える
1

良い質問。

1 番が最も柔軟であるため、1 番がベストのようです。

今日はたまたま地域でフィルタリングしていますが、明日は地域 + 部門 + 髪の色になる可能性があります。

データを細分化しすぎると、レポート用にすべてをつなぎ合わせるのに必要以上の作業が必要になるようです。

于 2009-01-12T03:34:58.997 に答える
0

私も同じ問題を抱えています。このような一般的なタスク(ユーザープロファイルに基づいてモデルエンティティのリストをフィルタリングする)に、それを行うための「標準的な」方法、パターン、またはベストプラクティスがないことは信じがたいことです。

PostgreSQLモジュールのpgaclを見つけました。基本的には、通常どおりにクエリを実行してから、acl_access()述語を追加してフィルターとして機能させます。

たぶん、MySQLにも似たようなものがあります。

于 2009-02-06T13:03:14.927 に答える
0

ACL を使用することをお勧めします。他の選択肢よりも柔軟です。Spring Security を使用します。Spring Framework を使用しなくても使用できます。リンクテキストからチュートリアルを読む

于 2009-06-18T12:54:54.567 に答える