既存の NHibernate アプリケーションをマルチテナント アプリケーションのようなものに強制しようとしています。データ モデルはかなり大規模 (60 以上のエンティティ) ですが、これらのエンティティの小さなサブセットのみを保護する必要があります。追加の問題として、データ アクセス モデルは、セキュリティを無視する必要がある別のアプリケーションで使用されます。
そのために、セキュリティ保護可能なエンティティの ACL を表すエンティティをさらに作成しました。
LoadCollection リスナーを追加することで、セキュリティのように見えるものを取得することができました。保護されたエンティティのコレクションが読み込まれると、それぞれの ACL をチェックし、アクセスが許可されていない場合はリストから削除します。
ただし、単一のエンティティをロードするときに同じことを達成する方法がわかりません。PreLoad イベント リスナーがあり、呼び出し元がアクセス権を持っているかどうかを判断できます。アクセス権がない場合は、null アイテムを返したいと思います。イベントに関連付けられたエンティティを null に設定し、セッションからエンティティを削除しようとしました。
このイベントの使用に関するドキュメントは、地面ではかなり薄いです。ほとんどの場合、保存する前に発生するイベントは、実際に機能する例です。NHibernate クックブックは、イベントの署名が異なる非常に古いバージョンの NHibernate を使用しています (たとえば、NHibernate 3.3.x の void ではなく bool を返します)。
編集: NHibernate のソースを詳しく調べたところ、間違った Load イベントを見ていたことがわかりました。「PreLoad」と「PostLoad」を試しましたが、昔ながらの「Load」イベントが私が求めていたものであることに気づきませんでした。
ただし、これにより新しい問題が発生しました。保護されていないが保護された親を持つオブジェクトをロードすると、Load イベント リスナーが親のプロキシに対して起動します。熱心な読み込みかどうかにかかわらず、親プロキシには正しい ACL がありません。毎回空になります。