粒度数据库记录访问权限(例如,组“X”和个人“Smith”可以查看记录Z)

时间:2009-09-13 22:07:28

标签: database-design access-control

我有记录(联系人,地址等),以下任何一项都可以访问(包含组合,例如2组和4个人):

  • 大家
  • 多个小组/部门的成员
  • 单个团体/部门的成员
  • 多个人
  • 单个人

实现这一目标的好数据库结构是什么?基本上在我的应用程序中,我需要能够限制用户XYZ何时登录,只向他显示作为个人,组成员“可见”的记录,或者因为它们对每个人都可见。

基本上我正在寻找一种有效存储这些关系的方法。它应该很快,因为我会在每次任何人看到任何东西时看到关系

我真的很感激有关如何做到这一点的一些提示!

谢谢!

编辑:我正在使用SQL Server 2008网络版。

2 个答案:

答案 0 :(得分:4)

这是朝着RBAC方向发展 - 基于角色的访问控制。您可能还想知道是否使用LBAC - 基于标签的访问控制。而且,根据您的DBMS,可能还有其他方法可以实现它(例如,考虑Oracle VPD - 虚拟专用数据库)。所有这些都是相当或非常DBMS特定的 - 针对不同DBMS的不同解决方案。

您似乎在谈论行级别的控制。也就是说,联系表中的一行可供所有人访问,而另一行只能访问一组部门,另一部分只能访问一组人员,依此类推。

请记住,关系DBMS最适合使用集合。单个组是一组具有一个成员组的组;单个用户是一组具有一个成员用户的组。这意味着我们处理的案件较少。

如果你想在标准SQL中实现它,那么我认为你将需要使用利用控件表等连接的视图组合。具有这样一个系统的硬件部件填充控制表并限制管理用户(实际上,限制管理员始终是困难的部分之一)。

基本技术是:

  • 使用适当的列创建基表,以标识适用于表中每行的权限集。
  • 取消对该表的所有公开访问权。
  • 在基表上创建一个视图,该视图显示基表中允许的所有列。它将是一个带有控制表的连接视图,可以暂时定义。视图查询条件也将受当前用户的限制。
  • 授予对视图的适当访问权限。
  • 在视图上创建适当的INSTEAD OF触发器,以处理视图上的插入,删除和更新操作,将更改中继到基表。
  • 创建控制表以与基表连接。
  • 使用适当的数据填充它。
  • 浅蓝色触摸纸,然后站稳。

现在,关于加入列和控制表......

有人必须指定哪些权限适用于表中新插入的行 - 提供的默认访问权限是什么。有人必须定义如何覆盖默认访问。这两个都可能很混乱。

有几种方法可以构建控制表:

  1. 一种机制依赖于基表中的每一行具有唯一ID(可能是自动生成的ID或只是主键的值)。然后,控制表包括该唯一ID的副本,并定义哪些用户或组可以访问它。这意味着控制表中可能存在给定行的多个条目,每个用户或组可以访问该行。在此方案中,控制表具有引用基表的外键。

  2. 另一种机制将ID号嵌入到基表中,该基表是控制表的外键。它基本上标识了一组权限,基表中的引用意味着该行具有与访问控制ID相关联的访问权限。控制表背后的结构可能是ID 0无法访问任何人(通过视图),ID 1可以访问所有人,其他值指定用户和组的组合 - 每个不同的组合具有不同的ID。有了这个,控制表集中可能会有几个表 - 我们还讨论了为每个受保护的表提供一组这些控制表。

  3. 显然,对控制表的访问受到严格限制 - 但对管理谁可以看到什么也很重要。

    这两个都是管理噩梦 - 这就是为什么你最终可能得到DBMS提供的访问控制机制而不是通用的SQL解决方案。

答案 1 :(得分:0)

我同意Jonathon的技巧,但不一定关于噩梦。我已经基于以下单一的权利联盟实现了这一点:

  • 谁创建了基本记录
  • 业务部门表示 基础记录
  • 指示的ad hoc用户组 基础记录
  • 内部部门表示 基础记录
  • 个人用户的临时拨款
  • 管理角色

性能很好,不管你信不信,虽然基表从不超过大约250K的记录......显然,更大的基表可能需要更精细的设计。但在我们的案例中,它运作良好,管理并不是什么大不了的事。创建和临时用户组分配是实际在任何类型的大规模使用的唯一规则。分配/撤销对群组的访问是一项持续的任务,但是随着领土的到来。