哪些设计模式(如果有)在实现基于用户的记录级权限时很有用



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

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

我目前正在考虑向所有私有域对象添加一个所有者字段,并实现一个对数据库的所有查询都必须通过的类。 此类将确定要查询的域对象是否为私有对象。 如果是这样,此类会将所有者筛选器追加到查询。 这听起来合理吗?

问题的第二部分非常接近存储库模式的描述。此方法可用于通过强制插入特定于用户的筛选器来解决逐条记录的访问问题。

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

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

最新更新