如何在行的基础上实现数据库访问控制

时间:2009-07-13 22:47:24

标签: sql-server database security

我目前正在开发一个小型企业数据库应用程序,我们计划在下次将其用于多用户访问。

数据库主要包含项目(在项目表中),其中包含一些包含附加信息的连接表。

我们的客户对多用户操作的一个要求是主要基于项目级别的细粒度访问控制(即用户只能访问某些项目)。我想知道如何实现这个。

使情况变得更加困难的原因是数据库访问主要发生在自行开发的持久层中,该层构造所需的SQL查询(类似于nhibernate)。

我能想到的唯一解决方案是在实现访问检查的数据库中实现存储过程(或读访问视图?)。由于我们的持久层当前依赖于对表的完全访问,这意味着为每个表实现读取视图,一个插入和一个删除命令,并更改持久层以便使用这些命令(而不是构造INSERT / DELETE查询) 。

我想知道是否有其他解决方案不需要更改我们的代码...

2 个答案:

答案 0 :(得分:1)

这种事情可能很难做到正确。除此之外,像这样的需求是构建在打包系统之上的一个原因 - 它们已经有了尚未编写的修复错误。

如果您必须自己动手,那么我建议您专注于获得正确的安全性方面,并担心以后更改您的代码。您不希望因为不想更改代码而牺牲安全性。

您可以安排将一条额外的信息传递到存储过程中。根据您的SQL Server版本,这可能是一段XML或一个表值参数。它将包括确定用户应具有的访问权所需的所有信息。也许只是一个用户ID,但谁知道?

您需要创建使用此信息来过滤基于访问权返回的行集的视图和/或表值函数。

答案 1 :(得分:1)

一种简单(但粗略)的方法是使用VIEW为每组用户创建WITH CHECK OPTION。您可能还需要在这些INSTEAD OF上使用VIEW个触发器,以便为INSERTUPDATEDELETE操作提供更复杂的逻辑。