详细的应用程序权限架构的建议

时间:2012-04-25 13:45:39

标签: c# .net architecture permissions

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

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

  • 用户
  • 公司

用户很简单,他们只有角色可以访问应用程序中的区域,没有数据会发生变化。

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

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

查询数据时,我有一些要求:

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

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

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

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

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

任何人都可以建议一个很好的方法来实现具有此级别的详细信息(行和列,基本上)在框架级别的权限,以确保适当和自动设置限制?

1 个答案:

答案 0 :(得分: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添加一些参数:当前用户,以及一些上下文信息。

为了获得20个产品,您可以编写如下代码:

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);
}