1

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

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

  • 用户
  • 公司

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

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

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

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

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

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

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

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

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

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

4

1 回答 1

0

我研究了一个类似的问题。基本上,我的伪算法是:

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);
}
于 2012-04-25T14:39:35.787 回答