5


2

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

私は地域ベースでデータベースフィルタリングを強制しようとしています。 私のシステムにはさまざまなユーザーがいて、それぞれが地方事務所に割り当てられています。 私は、自分の地域事務所に関連付けられているデータをユーザーが見ることができるようにするだけです。

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

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

1)selectのようなものが読めるようにすべてのデータベースクエリを修正します。 * tablexからregion = "myregion"まで。 これは厄介です。 JPAではうまくいきません。例えばentitymanager.find()メソッドは主キーしか受け付けません。 もちろん、私はネイティブに行くことができますが、私は1つのselectステートメントを見逃すだけでよく、私のセキュリティは撃たれます

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

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

4)ACL - 本当によくわからない。 aがtablexから*を選択した場合。自分がアクセスできないオブジェクトを静かに除外するのでしょうか、それとも大量のアクセス例外がスローされるのでしょうか。

しかし、私はこれについてあまり考えすぎていますか? これは本当に一般的な問題のようです。 簡単な解決策があるに違いありません。 可能な限りソースに近い場所でフィルタをかけたいので、それはデータベースの近くにある、あるいはデータベース内にあるはずです。

偽装されているとは思わない - 任意のリンク、キーワード、アイデア、コマーシャル/オープンソース製品の提案は本当に感謝されるでしょう! ありがとう。

4 Answer


1


良い質問。

それが最も柔軟であるので#1が最良であるように思えます。

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

データを切り出し過ぎると、レポート作成のためにそれらをまとめて接着するのに必要以上に頑張って動かなくなる可能性があります。


1


私は、会計パッケージの階層的な複数会社拡張のために、ここ数週間、似たようなもの(REALbasicがMySQLと話す)を実装したところです。

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

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

その部分に対する唯一の解決策は、すべての暗黙の関係とたくさんの監査とグリップのソースコードを表示するためのDBダイアグラムの非常に慎重な構築と、追加の制限を必要としないとしてOKだった領域を示す慎重なコメントでした。

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

この抽象化により、他の制限境界を表す疑似エンティティを実装するだけでなく、一部のデータを共有できます。

私がJavaとSpringについて話すことができるほど十分に知りませんが、ビューが地域フィルタによって制限されている場合に単一キールックアップを提供するためにビューを使うことができる方法はありますか?

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


0


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

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

MySQLにも似たようなものがあるかもしれません。


0


ACLを使うことをお勧めします。 他の選択肢よりも柔軟性があります。 Spring Securityを使用してください。 Spring Frameworkを使わなくても使えます。 link textからチュートリアルを読んでください。