1

我试图将现有的 NHibernate 应用程序强制转换为多租户应用程序。数据模型相当大(60 多个实体),尽管这些实体中只有一小部分需要保护。作为一个额外的问题,数据访问模型用于应该忽略安全性的单独应用程序中。

为此,我在安全实体上创建了代表 ACL 的更多实体。

通过添加 LoadCollection 侦听器,我设法获得了一些看起来像安全的东西。加载一组安全实体时,我会检查每个实体的 ACL,如果不允许访问,则将其从列表中删除。

但是,我不知道在加载单个实体时如何完成同样的事情。我有一个 PreLoad 事件侦听器,我能够确定调用者是否有权访问。如果他们无权访问,我想返回一个空项目。我尝试将与事件关联的实体设置为 null 并将实体从会话中逐出。

关于使用此事件的文档非常稀少:主要是在保存之前触发的事件有工作示例。NHibernate Cookbook 使用了一个非常旧的 NHibernate 版本,具有不同的事件签名(例如,它们返回 bool 而不是 NHibernate 3.3.x 的 void)。

编辑: 通过 NHibernate 源代码探索之后,我确定我正在查看错误的 Load 事件。我尝试了“PreLoad”和“PostLoad”,但没有意识到我所追求的是普通的旧“Load”事件。

这引发了一个新问题:当加载一个不安全但有一个安全父对象的对象时,我的 Load 事件侦听器将为父对象的代理触发。无论是否急切,父代理都不会有正确的 ACL:它每次都空着。

4

1 回答 1

2

使用这种设计的 NHibernate 应用程序的一个很好的完整示例可以在 NHibernate 最佳实践中找到,我们正在将它用于具有 300 多个实体的企业重型 Web 应用程序并取得了巨大的成功。最重要的是,我们实现了上下文控制机制,每个最终用户在登录时都请求一个安全令牌,并在每次连续调用时使用它,在每次连续调用时,我们检查安全令牌以进行验证并使用它来创建附加标准这会根据每个用户的配置限制每个用户的访问权限。这是一个大项目,但它为我们提供了良好的开发和维护基础设施。

于 2013-05-20T12:22:04.077 回答