【问题标题】:Suggestions for Detailed Application Permissions Architecture详细应用权限架构建议
【发布时间】:2012-05-06 05:14:36
【问题描述】:

我有一个应用程序需要对其权限系统进行大修。

此应用程序有 2 类需要保护的“实体”:

  • 用户
  • 公司

用户很简单,他们只是拥有可以访问应用程序区域的角色,不会改变任何数据。

公司可以是 3 种类型之一 - 管理(目前只是拥有产品的“主”公司)、合作伙伴(产品的经销商)和标准(仅使用产品的人)。

产品也有公司“集团”的概念,因为经销商可以以不同的名称销售产品,但需要能够一次看到所有数据。因此,每个公司始终属于一个集团,而每个集团又归一个公司所有。

查询数据的时候,我有几个要求:

  • 如果属于经销商公司A的用户查询数据,经销商拥有的所有组中的所有公司都需要显示
  • 如果属于标准 B 公司的用户查询数据,他们应该只看到自己的信息
  • 如果属于行政公司 C 的用户查询数据,他们应该会看到所有内容
  • 最后,显示的实际数据需要按公司类型进行过滤 - 管理公司看到的数据比经销商多,经销商比标准公司看到的信息更多

现在,当前系统实际上完成了大部分工作,但有很多:

List<int> groups;
if(CompanyType == CompanyType.Reseller){
  groups = [some list of groups]
}else{
  ....
}

这是相当丑陋且容易出错的。

我们正在使用 SubSonic、WCF(整个系统采用 REST 接口设计)、PostSharp 和 C#,因此您了解可用的工具。

谁能建议一种在框架级别以这种详细程度(本质上是行和列)实现权限的好方法,以确保适当且自动地设置限制?

【问题讨论】:

    标签: c# .net architecture permissions


    【解决方案1】:

    我曾研究过类似的问题。基本上,我的伪算法是:

    IEnumerable<MyData> allDatas = DataAccessLayer.GetDatas();
    IEnumerable<MyData> filteredDatas = RuleEngine.Filter(allDatas);
    // filteredDatas contains only the datas that the user is authorized to view
    

    首先,我从数据库中获取所有产品。然后我用业务规则过滤它们。您可能需要向 RuleEngine.Filter 添加一些参数:当前用户,可能还有一些上下文信息。

    为了得到二十个产品,你可以写一些像这样的代码:

    IDataReader reader = GetReader();
    var products = new List<Product>();
    while(reader.Read() && products.Count < 20)
    {
        var product = BuildProduct(reader);
        if(RuleEngine.Filter(new Product[] { product }).Any())
            products.Add(product);
    }
    

    【讨论】:

    • 这会带来什么样的性能影响?如果我有一个包含 100,000 条记录的表,我想尽可能在​​数据库级别对其进行过滤...
    • 您是否有需要加载 100,000 条记录的场景?例如,对于您的产品,您可能会按类别和其他一些标准对其进行过滤。
    • 很多时候它只是一个前 20 个过滤器,所以我有一个查询将它限制在那里...否则我必须查询 top-X,并希望过滤器不返回少于 20 :)
    • 第一行很吓人 IEnumerable allDatas = DataAccessLayer.GetDatas();
    猜你喜欢
    • 2012-08-04
    • 2012-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-14
    • 1970-01-01
    • 2016-03-19
    相关资源
    最近更新 更多