我有一个需要对其权限系统进行大修的应用程序。
此应用程序有两种需要保护的“实体”:
用户很简单,他们只有角色可以访问应用程序中的区域,没有数据会发生变化。
公司可以是3种类型之一 - 管理(目前只是拥有该产品的“主”公司),合作伙伴(产品的经销商)和标准(仅使用该产品的人)。
该产品还具有“团体”公司的概念,因为经销商可以以不同的名称销售产品,但需要能够一次查看所有数据。因此,每个公司总是属于一个集团,而每个集团又由一个公司所有。
查询数据时,我有一些要求:
现在,当前的系统实际上完成了大部分工作,但它有很多:
List<int> groups;
if(CompanyType == CompanyType.Reseller){
groups = [some list of groups]
}else{
....
}
这是相当丑陋和容易出错的。
我们正在使用SubSonic,WCF(整个系统设计有REST接口),PostSharp和C#,因此您了解可用的工具。
任何人都可以建议一个很好的方法来实现具有此级别的详细信息(行和列,基本上)在框架级别的权限,以确保适当和自动设置限制?
答案 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);
}