0

我需要一些意见。使用Postgresql作为中间层。需要意见

我打算为朋友开发POS和库存软件。这是一个单人小规模项目,所以我想让架构尽可能简单。

我使用Winform开发GUI(Web界面对POS软件没有意义)。对于数据库,我使用Postgresql。

该程序将基于用户角色控制访问,所以要么我必须开发一个中间层,使用Web服务器来控制用户访问,或者我可以直接在Postgresql中设置用户授权。

开发一个中间层将非常耗时,维护将变得更加复杂。所以我更喜欢直接在数据库中设置访问控制。

现在看来,使用数据库来控制用户访问是麻烦的。我必须为每个角色设置专家。更不用说,对于一些表格,这些专家是在专栏级别。这使得关于安全性的推理非常困难。

所以我现在要做的是将所有的表设置为除超级用户以外无法访问。该程序将使用公共角色连接到数据库。由于公众无法访问这些表,因此我将使用SECURITY DEFINER(具有超级用户角色)制作可公开访问的存储功能。访问表的唯一方法是使用这些函数。

我将把用户角色和密码放在一个表中。由于非超级用户无法访问用户表,因此我将创建一个登录函数,我们称之为fn_login(username, password)。如果登录成功,fn_login将返回会话密钥。

要调用其他函数,我们需要为用户提供会话密钥,例如:fn_purchase_list(session_key),fn_purchase_new(session_key, purchase_id, ...)

这样,我将存储的函数视为API。添加新用户会更容易,因为我只需要在用户表中添加新行,而不是添加新的Postgresql角色。我不需要在专栏级别设置专业知识。所有控件都将以编程方式完成。

那么你怎么看?这种方法是否可行和可扩展?有没有更好的方法来做到这一点?

谢谢!

回答

2

我相信有一个更好的方法来做到这一点。但是由于您尚未讨论您需要的安全类型,因此我无法详细说明具体情况。

由于您在.NET中开发应用程序代码,因此需要信任该代码(与Web应用程序不同)。因此,为什么不简单地在应用程序代码而不是数据库中实现角色和权限?

我对您陈述的方法的担忧是存储过程的人力开销。宁愿看到你用C#编写规定的函数,而不是在PostgreSQL中。然后,可以应用标准版本控制和软件开发技术。

1

如果你等到有人在你的数据库检查安全性,我想你会太迟。这是90年代末发生的客户端/服务器心态。这是n层架构流行的原因之一。客户端/服务器不能像N层解决方案那样水平扩展。

我建议你更好地利用中间层。与持久层相比,安全性应该是一个贯穿整个堆栈的关注点。

+0

并非每个应用程序都需要扩展。 90年代的客户端/服务器技术对于许多组织而言都是可行的。由于大型组织实际上通过使用技术获得的简单事实表明其有效。也许不是最佳的,但至少可行。很可能,这个应用程序并没有接近这些问题。当然有限制,这是一个像其他任何设计考虑。 – 2009-12-13 04:18:34

+0

但问题专家问道:“这种方法是否可行和可扩展?”可行?当然。可扩展的?这取决于人们需要走多远,并没有任何暗示。 – duffymo 2009-12-13 11:53:28

+0

嗯,我读过“一个人的小规模项目,所以我想让建筑尽可能简单”,并认为这个问题已经得到解答。 – 2009-12-14 21:26:53

0

如果数据库安全性的管理是问题,那么您应该添加自动执行该管理的任务。这意味着您可以将更高级别的数据存储在数据库表中,然后您的应用程序可以将该数据转换为数据库所需的相应详细信息和工件。

听起来好像数据库有你需要的细节,你只需要促进对细节的管理,并将其滚动到你的应用程序中。