Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 在实现基于用户的记录级权限时,哪些设计模式(如果有的话)是有用的?_Asp.net Mvc_Entity Framework_Design Patterns - Fatal编程技术网

Asp.net mvc 在实现基于用户的记录级权限时,哪些设计模式(如果有的话)是有用的?

Asp.net mvc 在实现基于用户的记录级权限时,哪些设计模式(如果有的话)是有用的?,asp.net-mvc,entity-framework,design-patterns,Asp.net Mvc,Entity Framework,Design Patterns,我正在使用ASP.NETMVC和实体框架实现一个web应用程序,实体框架使用存储库模式进行数据访问。此应用程序将有多个不相关的用户创建对象。每个用户只能访问自己的对象 是否有任何模式或内置EF功能提供了确保用户只能访问自己记录的方法? 我目前正在考虑向所有私有域对象添加一个owner字段,并实现一个所有对DB的查询都必须通过的类。此类将确定所查询的域对象是否是私有的。如果是这样,这个类将在查询中附加一个所有者过滤器。这听起来合理吗?你问题的第二部分非常接近于对问题的描述。这种方法可以通过强制插入

我正在使用ASP.NETMVC和实体框架实现一个web应用程序,实体框架使用存储库模式进行数据访问。此应用程序将有多个不相关的用户创建对象。每个用户只能访问自己的对象

是否有任何模式或内置EF功能提供了确保用户只能访问自己记录的方法?


我目前正在考虑向所有私有域对象添加一个owner字段,并实现一个所有对DB的查询都必须通过的类。此类将确定所查询的域对象是否是私有的。如果是这样,这个类将在查询中附加一个所有者过滤器。这听起来合理吗?

你问题的第二部分非常接近于对问题的描述。这种方法可以通过强制插入用户特定的过滤器来解决逐个记录的访问问题

这种方法将客户机业务逻辑与基于行的安全性的实现分离:如果以后决定更改逐个记录访问的实现方式,则只需修改存储库实现。客户端甚至不需要重新编译

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);
        }
    }
}
IMyRepository{
易货订单;
可解决的问题;
}
//MyRepository的另一部分是EF生成的。
//假设EF提供以下属性:
//-ObjectSet AllOrders
//-对象集所有问题
公共部分安全存储库:IMyRepository{
私有只读Guid用户ID;
public SecureRepository(Guid userId):this(){
this.userId=userId;
}
公共可撤销命令{
得到{
返回AllOrders.Where(ord=>ord.UserId==UserId);
}
}
公共问题{
得到{
返回AllIssues.Where(csi=>csi.UserId==UserId);
}
}
}

您可以添加写入方法,在将订单和问题保存到数据库之前设置
UserId

问题是,用户关联通常被视为元数据,而不是数据。您可以将数据放在一起,但如何区分所有用户都需要访问的表和只有用户特定数据的表?如果你需要这样的机制,通常你必须自定义构建它。我想让那些私有的域对象实现一个IPrivateData接口,该接口还定义OwnerId字段。如果一个域对象没有实现该接口,那么它是公共的;但是我不认为你会找到这样的模式,因为它似乎是特定于业务案例的。逐个记录的访问逻辑可以而且应该与存储库解耦吗?让每个存储库逐个记录访问是否合理,或者某个第三方是否可以对所有存储库进行管理?@tQuarella我添加了一个过于简化的代码示例,说明了如何使用EF实现它。如果业务代码与IMyRepository交互,则数据预过滤的事实将隐藏在业务逻辑中。