在软件开发方面,我当然不是DBA,也不是初学者,所以对任何帮助表示赞赏。在一个数据库中存储来自多方的数据的最安全结构是什么?例如,如果三个人可以访问相同的表,我想确保每个人只能看到他们的数据。是否最好为每个人创建一个唯一的ID,并将其与数据一起存储,然后根据该ID进行查询?我还应该考虑其他因素吗?
答案 0 :(得分:0)
您处于正确的轨道,但将USER ID映射到表中可能不是您想要的,因为在实践中,许多用户可以访问公司数据。在这些情况下,您将“CorpID”存储为列,或更一般地“ContextID”。但是,是的,为了限制对数据的访问,每行应该能够直接传达数据的用户(该行实际上包含对CorpID,UserID,ContextID等的引用),或者可以通过加入其他行来推断它。引用限定符的表。
实际上,这些规则由查询数据库的中间层强制执行,以某种方式提供用户上下文,以便只从数据库中选择正确的记录并最终呈现给用户。
答案 1 :(得分:0)
......三个人可以访问相同的表格......
如果这些人可以通过像蟾蜍这样的查询工具直接查询表格,那么我们就会遇到严重的问题。如果没有,那就像他们通过某个中间层/服务层访问那样,然后@ wagregg上面的解决方案就成了。
当他们拥有直接访问权限时会遇到一种方法:
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();
大多数数据库系统(MySQL,Oracle,SQLServer)都提供了获取当前登录用户的方法。 (连接字符串中使用的那个)。它们还提供了限制对某些表的访问的方法。现在,对于您的用户,视图将表现为普通表。他们永远不会知道差异。
当用户太多时会出现问题。为每个人配置一个数据库级别的帐户可能会变得困难。但是像MsSQLServer这样的DBMS可以通过减少用户/创建问题来使用Windows身份验证。
在大多数情况下,过滤器在中间层方法是最好的方法。但有时候安全是至关重要的。此外,中间层中的错误可能允许恶意用户绕过安全性。 SQL注入是一个值得注意的事情。然后你必须做你必须做的事。
答案 2 :(得分:0)
听起来你在谈论多租户架构,但我无法确定。
This SO answer概述了这些问题,并链接到在线文章,其中包含有关权衡的详细信息。