【发布时间】:2014-12-02 19:22:50
【问题描述】:
我正在开发一个带有 PostgreSQL 数据库后端的文件管理系统。我正在使用 Qt 库编写客户端,该库将连接和查询数据库服务器。
文件管理系统默认限制所有用户访问顶级目录,除非特定用户有权访问特定顶级目录。任何人都可以将访问权授予任何人,只要授予访问权的用户自己已经拥有访问权。这是通过在数据库中维护一个具有 2 个外键的表来实现的:userID_fk 和 directoryID_fk。如果该表中存在特定用户可以访问特定目录的记录,则该目录将显示在用户的屏幕上。否则,该目录对用户不可见。
这种设计提出了一个挑战:用户已经能够连接到数据库,并且就数据库服务器而言是合法用户,因此无法访问某些目录的用户很容易给他们自己通过简单地连接到数据库服务器而不使用我的客户端应用程序来访问,并且只需在表中添加一条带有目录 ID 和他们自己的用户 ID 的记录。但是,我不能允许这样做。
我想要实现的是让所有数据库用户完全访问数据库服务器,但只能通过我自己的客户端应用程序而不是在它之外。
我已经想到了几种解决这一挑战的方法,但我正在寻求您关于最佳架构的建议,以防止用户在我的客户端应用程序之外访问数据库服务器。
我想到的可能的设计方法:
- 编写我自己的服务器来维护允许连接到数据库服务器的用户列表。新的数据库用户只能使用这个“服务器”创建,用户的密码由两部分组成——第一部分是实际用户提供的密码,第二部分是随机生成的字符串,其副本存储在“服务器”。当用户登录我的“服务器”时,服务器将密码的第二部分提供给客户端,用户将提供密码的第一部分。这两个密码将连接起来并用于登录数据库服务器。这达到了预期的目标,因为用户的数据库密码与用户所知道的不同,因此如果不先向我的“服务器”查询密码的第二部分,就无法登录数据库服务器。
然而,这种设计对用户来说很麻烦——用户必须提供一个密码才能连接到我的“服务器”,然后再提供第二个密码才能连接到数据库服务器。在我的特殊情况下,数据库服务器上的数据也是加密的,这意味着用户必须提供第三个密码才能访问数据库。我认为这对于普通用户来说有点多。
- 另一种设计是编写我自己的服务器,为客户端提供所有功能。所以客户端只查询我的“服务器”和我的“服务器”然后查询真正的数据库服务器。从客户端的角度来看,这提供了一种更简洁的方法,因为只需要提供 2 个密码,但这更难编程,我将重新发明轮子,因为数据库服务器已经具有出色的多用户并发访问,这非常快速可靠。我的服务器会增加额外的复杂性并可能显着降低速度,因此可能不是一种实用的方法。
除了这两种方法之外,我还没有想到更好的设计。我非常感谢您的建议,包括您对我提出的设计的想法。非常感谢。
【问题讨论】:
-
为什么不使用 Postgres 的内置安全性?
-
我很乐意。您能否更具体一些并推荐特定的功能?
标签: database-design architecture