在单个表中安全地存储多方的数据

时间:2013-06-07 12:39:51

标签: database database-design

在软件开发方面,我当然不是DBA,也不是初学者,所以对任何帮助表示赞赏。在一个数据库中存储来自多方的数据的最安全结构是什么?例如,如果三个人可以访问相同的表,我想确保每个人只能看到他们的数据。是否最好为每个人创建一个唯一的ID,并将其与数据一起存储,然后根据该ID进行查询?我还应该考虑其他因素吗?

3 个答案:

答案 0 :(得分:0)

您处于正确的轨道,但将USER ID映射到表中可能不是您想要的,因为在实践中,许多用户可以访问公司数据。在这些情况下,您将“CorpID”存储为列,或更一般地“ContextID”。但是,是的,为了限制对数据的访问,每行应该能够直接传达数据的用户(该行实际上包含对CorpID,UserID,ContextID等的引用),或者可以通过加入其他行来推断它。引用限定符的表。

实际上,这些规则由查询数据库的中间层强制执行,以某种方式提供用户上下文,以便只从数据库中选择正确的记录并最终呈现给用户。

答案 1 :(得分:0)

  

......三个人可以访问相同的表格......

如果这些人可以通过像蟾蜍这样的查询工具直接查询表格,那么我们就会遇到严重的问题。如果没有,那就像他们通过某个中间层/服务层访问那样,然后@ wagregg上面的解决方案就成了。

当他们拥有直接访问权限时会遇到一种方法:

  1. 为每个用户创建数据库级用户帐户。
  2. 有另一个包含行级别授权信息的表。说your_table有一个主键列MY_PK_COL,那么GRANTS_TABLE表的结构就像{USER_ID; MY_PK_COL} MY_PK_COL your_table的外键SELECT * FROM your_table WHERE user_id=getCurrentUserID();
  3. 从your_table
  4. 中删除相关用户的所有权限
  5. 创建一个视图。 {{1}}
  6. 为您的用户提供此视图的SELECT / INSERT / UPDATE权限。
  7. 大多数数据库系统(MySQL,Oracle,SQLServer)都提供了获取当前登录用户的方法。 (连接字符串中使用的那个)。它们还提供了限制对某些表的访问的方法。现在,对于您的用户,视图将表现为普通表。他们永远不会知道差异。

    当用户太多时会出现问题。为每个人配置一个数据库级别的帐户可能会变得困难。但是像MsSQLServer这样的DBMS可以通过减少用户/创建问题来使用Windows身份验证。

    在大多数情况下,过滤器在中间层方法是最好的方法。但有时候安全是至关重要的。此外,中间层中的错误可能允许恶意用户绕过安全性。 SQL注入是一个值得注意的事情。然后你必须做你必须做的事。

答案 2 :(得分:0)

听起来你在谈论多租户架构,但我无法确定。

This SO answer概述了这些问题,并链接到在线文章,其中包含有关权衡的详细信息。