有关详细应用程序权限体系结构的建议
本文关键字:体系结构 权限 应用程序 | 更新日期: 2023-09-27 18:32:24
我有一个应用程序需要对其权限系统进行大修。
此应用程序有 2 种需要保护的"实体"类型:
- 用户
- 公司
用户很简单,他们只有角色可以访问应用程序中的区域,不会更改任何数据。
公司可以是 3 种类型之一 - 管理(目前只是拥有产品的"主"公司)、合作伙伴(产品的经销商)和标准(仅使用产品的人)。
该产品还具有公司"组"的概念,因为经销商可以以不同的名称销售产品,但需要能够一次看到所有数据。因此,每个公司始终属于一个组,而每个组又归公司所有。
查询数据时,我有几个要求:
- 如果属于经销商公司 A 的用户查询数据,则需要显示经销商拥有的所有组中的所有公司
- 如果属于标准公司 B 的用户查询数据,他们应该只看到他们的信息
- 如果属于管理公司 C 的用户查询数据,他们应该看到所有内容
- 最后,显示的实际数据需要按公司类型进行筛选 - 管理公司比经销商看到的数据更多,经销商比标准公司看到更多信息
现在,当前的系统实际上完成了大部分工作,但它很多:
List<int> groups;
if(CompanyType == CompanyType.Reseller){
groups = [some list of groups]
}else{
....
}
这是相当丑陋和容易出错的。
我们使用SubSonic,WCF(整个系统设计有REST接口),PostSharp和C#,所以你知道可用的工具。
任何人都可以建议一种很好的方法在框架级别实现具有这种详细级别(本质上是行和列)的权限,以确保正确和自动地设置限制?
我研究过类似的问题。基本上,我的伪算法是:
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);
}