NHibernate实体安全/过滤

时间:2013-05-20 05:55:46

标签: nhibernate fluent-nhibernate

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

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

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

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

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

修改 在浏览了NHibernate源代码之后,我确定我正在查看错误的Load事件。我试过“PreLoad”和“PostLoad”,没有意识到普通的“加载”事件就是我所追求的。

这引发了一个新问题:当加载一个非安全但具有安全父级的对象时,我的Load事件监听器将为父代理启动。是否加载,父代理将没有正确的ACL:每次都是空的。

1 个答案:

答案 0 :(得分:2)

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

相关问题