Nhibernate 我应该在哪里过滤记录?

Nhibernate 我应该在哪里过滤记录?,nhibernate,authorization,Nhibernate,Authorization,我正在设计一个课程管理系统,它有不同类型的用户,包括系统管理员、部门经理和部门用户。正如您所料,系统管理员可以管理所有记录,分支管理器可以管理其分支的所有记录,分支用户只能管理其记录 我的问题是,应该在哪里进行过滤?我应该在DAL层做吗?或者只是从DAL返回所有记录,然后在其他层进行过滤?我一直在到处寻找关于授权的最佳实践,但我没有找到任何东西可以清楚地解释这一方面。一般来说,数据库记录的选择,无论出于何种原因,都应该由数据库完成——这就是它的工作 此外 您不希望不必要的记录浪费数据库服务器和

我正在设计一个课程管理系统,它有不同类型的用户,包括系统管理员、部门经理和部门用户。正如您所料,系统管理员可以管理所有记录,分支管理器可以管理其分支的所有记录,分支用户只能管理其记录


我的问题是,应该在哪里进行过滤?我应该在DAL层做吗?或者只是从DAL返回所有记录,然后在其他层进行过滤?我一直在到处寻找关于授权的最佳实践,但我没有找到任何东西可以清楚地解释这一方面。

一般来说,数据库记录的选择,无论出于何种原因,都应该由数据库完成——这就是它的工作

此外

  • 您不希望不必要的记录浪费数据库服务器和客户机之间的带宽
  • 您不希望不必要的记录占用客户机上的内存
  • 您不希望未经授权的记录在客户端计算机的内存中,因为它们可能被黑客攻击

这个问题的实现级别答案在很大程度上取决于您的工具。这会是.NET、Java、PHP、Python吗

DAL应该只关心返回数据并将数据提交到数据存储。您描述的过滤最好在中间层使用业务逻辑进行处理。大多数查询将在登录用户的上下文中发生,以便返回适当的数据,因此在设计系统时请记住这一点

更新:

给定.NET和NHibernate,NHibernate是您的ORM/DAL。DAL在理想情况下应该是一个存储库实现,允许您从数据库中获取数据


设计域模型以处理用户、角色和分支之间的关系。每个实体都与其他实体有关系。这些分支的“记录”也必须建模为实体。一旦在模型中建立了关系,就可以在每个实体上设计检索相关实体的方法。您可能认为这个模型是一种视图模型或控制器。它的工作是显式地实现实体之间的关系,在NHibernate提供的抽象之上创建一个抽象。

这是使用NHibernate进行DAL的.NET。我不知道的是,我是否应该让DAL知道执行查询的用户。一般来说,DAL应该不知道数据的性质,只知道如何将数据进出数据库。您应该在DAL上有一个域模型,它可以理解用户是什么,以及他们应该访问哪些对象。您将如何实现像GetRegistrationsForCourse这样的方法?返回的记录应根据调用它的用户进行筛选。请参阅我的更新:课程实体应具有注册集合。注册实体应具有课程集合。您需要在NHibernate提供的抽象层的基础上增加一个抽象层,您可以在整个应用程序中使用该抽象层与实体进行交互。