针对大型数据库数据库执行ACL的性能查询

时间:2015-01-28 12:28:07

标签: c# database design-patterns architecture acl

我正在更新一个Web应用程序,它需要更多动态控制用户对应用程序域资源的权限/访问权限。这些规则还需要由应用程序的管理员用户轻松配置。

-

背景

我的第一步是编写一个ACL模块 - 我想要一些简单且类型安全的东西,这很难找到,所以我最终编写了自己的实现。

ACL模块现在向我们提供以下内容:

  • 群组
  • 权限(例如查看/添加/编辑)
  • 资源(例如产品,页面,文件等)
  • 规则(即允许/拒绝资源上的组的权限)

他们的用法示例:

// Setting the ACL rule:
acl.Allow<View>(adminGroup, aProductResource); 

// Asserting the ACL rule:
if (acl.IsAllowed<View>(adminGroup, aProductResource))
{
    // allowed! :)
}

组结构表示为有向非循环图(即多重继承,例如家族树),规则继承组关系。即,子组从父组继承ACL规则。

资源本身也可以为它们(针对一个组或所有组)直接配置规则,并且它们之间也存在关系,这意味着子资源从父级继承规则。

我认为相当标准的ACL类型,但在断言对资源的访问时相当复杂,因为您必须首先根据您的上下文“合并”来自父组/资源的所有规则,然后计算结果。

出于性能原因,我将所有规则加载到内存中,并且它们是可序列化的,允许快速保存/加载它们。以规范化的方式将规则映射到数据库表几乎是不可能的。

-

问题:

针对单个域资源断言ACL规则可以很好地工作,但是当需要解析大量数据时会出现问题。

我正在更新的应用程序是“数据库驱动的”,其中包含相当大量的数据(即数百万“资源”)。

作为一个说明性的例子;在某些情况下,用户需要能够浏览/翻阅他们具有“查看”访问权限的所有“产品”。这对我来说是有问题的,因为目前这样做有一些存储过程可以过滤和返回数据。要用ACL系统替换此组件,我需要将数据库中的所有数据加载到应用程序中,然后使用ACL模块解析记录以检查用户是否可以访问它们。这显然是一项非常密集的任务,而且我正在努力寻找解决方案。

我想到的一个可能的解决方案是实际为每个产品预先计算和存储每个组的ACL断言的结果。然后可以将其存储在一个相当简单的模式数据库表中,该表包含每个可能的ACL断言的简单Yes / No结果,使得查询非常简单。然后,我可以在此表上进行连接,以提供仍然考虑ACL规则的大量数据集查询功能。显然,对于此解决方案,正在执行相当多的后台工作,因为每次添加“产品”或规则发生更改时,这都需要重新计算整个规则集的大部分内容。另一个问题是,这个表本身可能会变得非常庞大,特别是随着越来越多的组/特权被添加到ACL系统中。此表中的记录将需要PER group PER资源PER权限,因此如果我完成设计,我将不得不意识到这一点。

-

问题:

是否有任何已知策略允许此类ACL模块实现从数据库中对大型数据集进行性能查询?

也许有一个ACL库,对于任何语言,都需要考虑大规模的ACL查询?希望它也是开源的,我可以从中学习。 :)

我希望我对这类问题的巧妙解决方案完全无知。 :)

-

这可能是一个非常广泛/模糊的问题描述和问题。如果是这样,我道歉。如果这是这类问题的错误论坛,或者您推荐任何具体的其他细节,请告诉我。

0 个答案:

没有答案