我试图将现有的 NHibernate 应用程序强制转换为多租户应用程序。数据模型相当大(60 多个实体),尽管这些实体中只有一小部分需要保护。作为一个额外的问题,数据访问模型用于应该忽略安全性的单独应用程序中。
为此,我在安全实体上创建了代表 ACL 的更多实体。
通过添加 LoadCollection 侦听器,我设法获得了一些看起来像安全的东西。加载一组安全实体时,我会检查每个实体的 ACL,如果不允许访问,则将其从列表中删除。
但是,我不知道在加载单个实体时如何完成同样的事情。我有一个 PreLoad 事件侦听器,我能够确定调用者是否有权访问。如果他们无权访问,我想返回一个空项目。我尝试将与事件关联的实体设置为 null 并将实体从会话中逐出。
关于使用此事件的文档非常稀少:主要是在保存之前触发的事件有工作示例。NHibernate Cookbook 使用了一个非常旧的 NHibernate 版本,具有不同的事件签名(例如,它们返回 bool 而不是 NHibernate 3.3.x 的 void)。
编辑: 通过 NHibernate 源代码探索之后,我确定我正在查看错误的 Load 事件。我尝试了“PreLoad”和“PostLoad”,但没有意识到我所追求的是普通的旧“Load”事件。
这引发了一个新问题:当加载一个不安全但有一个安全父对象的对象时,我的 Load 事件侦听器将为父对象的代理触发。无论是否急切,父代理都不会有正确的 ACL:它每次都空着。