2012-04-25 58 views
1

我有一个需要对其权限系统进行大修的应用程序。关于详细应用权限的建议体系结构

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

  • 用户
  • 公司

用户很简单,他们只是有他们访问区域中的角色应用程序,没有数据会改变。

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

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

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

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

现在更多的信息,目前的系统实际上承担了大部分的这一点,但它是一个很大的:

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

这是相当丑陋容易出错。

我们使用SubSonic,WCF(整个系统设计有一个REST接口),PostSharp和C#,所以你知道可用的工具。

任何人都可以提出一个很好的方法来实现在这个级别的细节(行和列,本质上)在框架级别的权限,以确保限制设置适当和自动?

回答

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

这是否引进什么样的性能开销的关系吗?如果我有一个包含100,000条记录的表格,我想在数据库级别进行筛选,如果可能的话...... – jvenema 2012-04-25 19:27:55

+0

您是否有一种情况需要加载100,000条记录?例如,您可能会为您的产品按类别和其他标准过滤它们。 – schglurps 2012-04-26 08:17:22

+0

很多时候它只是一个前20位的过滤器,所以我有一个查询限制了它,否则我必须查询top-X,并希望过滤器不会返回小于20 :) – jvenema 2012-04-26 13:11:13