1

既存の NHibernate アプリケーションをマルチテナント アプリケーションのようなものに強制しようとしています。データ モデルはかなり大規模 (60 以上のエンティティ) ですが、これらのエンティティの小さなサブセットのみを保護する必要があります。追加の問題として、データ アクセス モデルは、セキュリティを無視する必要がある別のアプリケーションで使用されます。

そのために、セキュリティ保護可能なエンティティの ACL を表すエンティティをさらに作成しました。

LoadCollection リスナーを追加することで、セキュリティのように見えるものを取得することができました。保護されたエンティティのコレクションが読み込まれると、それぞれの ACL をチェックし、アクセスが許可されていない場合はリストから削除します。

ただし、単一のエンティティをロードするときに同じことを達成する方法がわかりません。PreLoad イベント リスナーがあり、呼び出し元がアクセス権を持っているかどうかを判断できます。アクセス権がない場合は、null アイテムを返したいと思います。イベントに関連付けられたエンティティを null に設定し、セッションからエンティティを削除しようとしました。

このイベントの使用に関するドキュメントは、地面ではかなり薄いです。ほとんどの場合、保存する前に発生するイベントは、実際に機能する例です。NHibernate クックブックは、イベントの署名が異なる非常に古いバージョンの NHibernate を使用しています (たとえば、NHibernate 3.3.x の void ではなく bool を返します)。

編集: NHibernate のソースを詳しく調べたところ、間違った Load イベントを見ていたことがわかりました。「PreLoad」と「PostLoad」を試しましたが、昔ながらの「Load」イベントが私が求めていたものであることに気づきませんでした。

ただし、これにより新しい問題が発生しました。保護されていないが保護された親を持つオブジェクトをロードすると、Load イベント リスナーが親のプロキシに対して起動します。熱心な読み込みかどうかにかかわらず、親プロキシには正しい ACL がありません。毎回空になります。

4

1 に答える 1

2

この設計を使用した NHibernate アプリケーションの完全な例は、 NHibernate のベスト プラクティスで見つけることができます。300 を超えるエンティティを持つエンタープライズ向けの重い Web アプリケーションで大成功を収めています。その上で、コンテキスト制御メカニズムを実装しました。各エンド ユーザーはログイン時にセキュリティ トークンを要求し、すべての順次呼び出しでそれを使用します。すべての順次呼び出しで、検証のためにセキュリティ トークンをチェックし、それを使用して追加の基準を作成します。構成に応じて各ユーザーのアクセスを制限します。これは大きなプロジェクトでしたが、開発と保守のための優れたインフラストラクチャを提供してくれました。

于 2013-05-20T12:22:04.077 に答える