2014-09-19 57 views
0

我有一个概念/建筑问题,我希望得到一些意见。在详细讨论细节之前,我想提一下,我非常了解将应用程序逻辑放入数据库的观点,以及保持抽象和关注点分离的重要性。将权限和授权逻辑放在数据库中

这就是说,这个应用程序是一个相当简单的应用程序,其中性能比最佳实践更重要。这是一个新的应用程序,使用非常现代化的技术构建,但是遵循旧学校原则(存储过程,无ORM等)。

我有一个相当复杂的“汇总视图”,它将由存储过程提供的数据驱动。这个视图的大多数元素都将具有权限逻辑(不是微不足道的,但没有太复杂的),它将基于当前登录的用户的权限改变数据的外观以及性质(即一些数据可能是匿名的,其他可能是隐藏的等)。

所有数据以及成员资格和ACL记录都存储在同一个数据库中。

所以,问题是在哪里把应用用户权利的逻辑。这两个选项是:

1)从数据库带回所有相关数据到域对象,然后在中间层

2)应用权限传递一个用户ID存储的过程,并具有它传递回一个早已准备好的结果中间层

第一眼看上去,从概念上讲,没有脑子似乎把它扔到中间层(第一选项),并留下关心什么数据库它最好 - 读取和写入数据。然而,存储过程已经被“定制”到了特定的视图(想想某些事情),而不是用于其他任何东西;因此,处理存储过程中的权限并使用已经应用的所有权限(结果将具有较少的数据)带回预备的结果似乎更容易和更轻松,而不是将所有数据带回中间层并在那里处理权限(最终放弃一半数据)。

我有点被撕裂,并会欣赏一些输入。直觉上,第二种选择似乎更适合,但“感觉”非常错误。

回答

1

设计存储过程以接受启用的权限或要使用的功能,例如,

PROCEDURE retrieve_data (id_or_other_params, 
         anonymize := FALSE, 
         hide := FALSE, 
         some_other_feature := FALSE); 

过程仅涉及数据检索,修改选项是从外部源读取的。现在让中间层认证用户,决定使用哪些选项并将它们传递给过程。

+0

这是一个很酷的想法,但它不适合我的情况。权限是每行的,并且基于也存储在数据库中的ACL;例如,第2行指的是实体#2,权限将取决于请求用户的实体#2的ACL,依此类推。我最终在数据库中这样做是因为它的速度更快(稍后可能会重构)。感谢您的意见,但! – Ruslan 2014-09-19 21:15:15