【问题标题】:NHibernate entity security/filteringNHibernate 实体安全/过滤
【发布时间】:2013-05-14 15:34:31
【问题描述】:

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

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

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

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

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

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

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

【问题讨论】:

    标签: nhibernate fluent-nhibernate


    【解决方案1】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-09
      • 1970-01-01
      • 2015-09-10
      相关资源
      最近更新 更多