2011-07-21 7 views
1

Spring 2.6/JPA 1/Hibernate 3.3アプリケーションでは、現在のユーザの権限に基づいていくつかのエンティティフィールドデータを非表示にする必要があります。ユーザ権限に基づいてHibernateエンティティのフィールド値を非表示/再マップする

など。エンティティ "Document"には、DOCテーブルのタイトル列にマップされるフィールド "title"があります。ユーザの許可に応じて、タイトルを読むことが許可されていない場合はタイトルに「機密」が表示されるか、データベースから取得された正しい値が含まれていなければなりません。同じことが他の多くのプロパティにも当てはまります。

問題は、UIでプレゼンテーションモデルやフィルタリングを適用できないという問題です。これは、エンティティオブジェクトが後処理を処理し、最終的にUIにデータを表示する別のレイヤに渡され、実際のデータ(つまり、「タイトル」の実際の値)がそのレイヤに渡されるべきではないためです公然とアクセス可能であること。したがって、エンティティオブジェクト自体は、APIを介して実際の値にアクセスすることなく「封印」する必要がありますが、エンティティは内部的にその状態を格納することがあります。

ユーザーが許可されていない場合、Documentオブジェクトのリストをフェッチし、それを反復してタイトルを「CONFIDENTIAL」に設定するのが唯一の方法です。もちろん、これによりエンティティが変更され、永続レイヤに戻ってくると、マージ時にタイトルの値( "CONFIDENTIAL")がデータベースに書き込まれます。

このように、これらのエンティティ(多くの作業)のカスタム挿入/更新ステートメントを作成したり、エンティティ内のデータを交換するカスタムローダーロジックを作成したりする必要があります。マージ時にエンティティの元の状態を保存して追跡することができます。また、EMメソッドをロードするのではなく、JPQL/HQLを使用すると失敗します。

だから、私の質問は以下のとおりです。

私は/メカニズムをマージするアップデートを壊していない一方で、現在のユーザーに基づいて「再マップ」エンティティに値をする必要がありますどのようなオプション
  • インターセプタ(HibernateまたはSpring/AOPスタイルのいずれか)がここで助けになる可能性がありますか?しかし、もう一度:どのようにマージを処理する?

おかげで、 ドワイトは

心にスプリング

答えて

0

1つのオプションは、エンティティが層を渡るような値を切り替えますあなたのアプリ(サービス層?)の適切な層全体に適用するには、スプリング側面を書くことです境界。途中で、それは "私の秘密の価値"から "秘密"に値を変更し、古い値とそれがどのエンティティから来たのかを覚えています。次に、エンティティが戻ったときに、「自分の秘密の値」をその場所に戻します。したがって、境界のあなたの側では、エンティティは常に適切な値を持ちますが、秘密の値は決して境界を離れず決して妥協することはできません。

+0

おかげさまですが、キャッシュに何らかの並べ替えが必要なため、値がマージされる前に分離されたエンティティに再適用される可能性があります。それがどのようにスケールされるかわからない。 – Dwight

+0

@Dwight:それはあなたが望むように拡大縮小します。最良のアプローチは、適切な退去戦略を備えた[Ehcache](http://ehcache.org/documentation/samples.html)(または同様の)キャッシュを使用して、荒れを取り除くことです。代替アプローチ:スワップアウトされた値をデータベースに格納し、後でそれらを検索します。 –

関連する問題