我正在使用ASP.NET MVC和Entity Framework使用Repository模式实现数据访问的Web应用程序.此应用程序将有几个不相关的用户创建对象.每个用户只能访问自己的对象.
是否有任何模式或内置EF功能,它们提供了一种方法来确保用户只能访问自己的记录?
我目前正在考虑向所有私有域对象添加所有者字段,并实现一个所有对DB的查询都必须通过的类.此类将确定要查询的域对象是否为私有.如果是这样,此类将在查询的所有者上附加过滤器.这听起来合理吗?
最佳答案 您的问题的第二部分非常接近
Repository Pattern的描述.此方法可用于通过强制插入特定于用户的过滤器来解决逐个记录的访问问题.
此方法将客户端业务逻辑与基于行的安全性的实现分离:如果您以后决定更改实现逐个记录访问的方式,则需要修改的只是存储库实现.客户端甚至不需要重新编译.
EF将所有业务实体的存储库定义为部分类.您可以在其上添加一个接口(在单独的文件中),并使用EF生成的方法实现存储库的方法:
IMyRepository {
IQueryable<ClientOrder> Orders;
IQueryable<ServiceIssue> Issues;
}
// The other part of MyRepository is EF-generated.
// Assume that EF provides properties these properties:
// - ObjectSet<ClientOrder> AllOrders
// - ObjectSet<ServiceIssue> AllIssues
public partial SecureRepository : IMyRepository {
private readonly Guid userId;
public SecureRepository(Guid userId) : this() {
this.userId = userId;
}
public IQueryable<ClientOrder> Orders {
get {
return AllOrders.Where(ord => ord.UserId == userId);
}
}
public IQueryable<ServiceIssue> Issues {
get {
return AllIssues.Where(csi => csi.UserId == userId);
}
}
}
您可以添加写入方法,以便在将订单和问题保存到数据库之前将其设置为UserId.