2009-07-13 73 views
2

我目前正在开发一个小型企业数据库应用程序,我们计划在下一次为其实现多用户访问。如何在行的基础上实现数据库访问控制

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

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

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

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

我不知道是否有不需要改变我们的代码,任何其他解决方案...

回答

1

这样的事情是很有挑战性得到的权利。除此之外,像这样的需求是构建在一个打包系统之上的一个原因 - 他们已经有了一些你还没有写过的bug。

如果您必须自己做,那么我建议您专注于获得安全性方面的权利,并担心以后更改代码。由于不希望更改代码,因此您不希望危及安全性。

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

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

1

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

相关问题