将权限和授权逻辑放在数据库中

时间:2014-09-19 03:20:13

标签: security database-design web-applications architecture

我有一个概念/架构问题,我希望得到一些意见。在进入细节之前,我想提一下,我很清楚反对将应用程序逻辑放入数据库的论点,以及维护抽象和关注点分离的重要性。

话虽如此,有问题的应用程序是一个相当简单的应用程序,其中性能比最佳实践更重要。这是一个新的应用程序,使用非常现代的技术,但根据旧学校原则(存储过程,没有ORM等)。

我有一个相当复杂的"摘要视图"这将由存储过程提供的数据驱动。此视图的大多数元素将具有权限逻辑(不是微不足道,但不是太复杂),它将根据当前登录用户的权限(即某些数据)更改数据的外观和性质可以匿名,其他可以隐藏,等等)。

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

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

  

1)将数据库中的所有相关数据带回域对象,然后在中间层应用权限

     

2)将用户ID传递给存储过程,并将已准备好的结果传回中间层

初看起来,从概念上讲,似乎是把它放到中间层(第一个选项)并让数据库关注它最擅长的事情 - 读取和写入数据。但是,存储过程已经过定制"特定的观点(按照报告的方式思考),而不是用于其他任何事情;因此,处理存储过程中的权限并带回已准备好所有权限的准备结果(结果可能具有较少的数据),而不是将所有数据恢复到中间层,这似乎更简单,更轻松并在那里处理权限(最终丢弃一半的数据)。

我有点沮丧,并会欣赏一些意见。直觉上,第二种选择看起来更合适,但"感觉"非常错误。

1 个答案:

答案 0 :(得分:1)

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

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

程序现在只涉及数据检索,修改选项从外部源读取。现在让中间层对用户进行身份验证,确定使用哪些选项并将其传递给过程。