【发布时间】:2009-12-13 01:05:59
【问题描述】:
我需要一些意见。
我要为朋友开发一个 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 角色。我不需要在列级别设置权限。所有控件都将以编程方式完成。
那你怎么看?这种方法是否可行且可扩展?有没有更好的方法?
谢谢!
【问题讨论】:
标签: postgresql stored-procedures stored-functions middle-tier