具有权限分离的多用户桌面应用程序

时间:2013-04-17 20:00:26

标签: c++ postgresql

我正在编写一个带有postgresql 9.2数据库后端的C ++应用程序。这是一个会计软件。它是具有权限分离功能的多用户应用程序。

我需要帮助来实现用户帐户系统。用户的权限不必相互排斥。我应该在应用程序级别还是在数据库级别实现它?

目前公司规模不大。假设约有15-20个办事处,每个办公室平均有10个计划用户。

  • 我可以利用postgres中的角色来实现这个吗?它会变得太繁琐,难以管理,或者这种方法有什么缺陷吗?
  • 如果我通过应用程序路径,如何存储用户拥有的权限集?二进制字符串是否足够?如果以后有其他权限,我该如何合并呢?我需要做些什么来确保没有安全问题?在这种方法中,我假设应用程序连接了最有特权的用户所需的权限。
  • 这两种方法的某种组合?还是完全不同的东西?

欢迎所有建议和论点。

1 个答案:

答案 0 :(得分:1)

永远不要从客户端应用程序提供授权,该应用程序在不受控制的环境中运行。用户可以物理访问的每个设备都是一个不受控制的环境。这是通过默默无闻的安全性 - 用户只需使用调试器从客户端程序内存中获取数据库访问凭据,只需使用psql即可执行任何操作。

使用角色。

当我开发C ++ / PostgreSQL桌面应用程序时,我选择禁止所有用户访问以修改所有表,并且我使用带有VOLATILE SECURITY DEFINER选项的Pl / PgSQL函数创建了一个API。但我认为这不是一种最好的方法,因为它不自然且易于使用,例如:

select add_person(?,?,?,?,?,?,?,?,?,?,?,?);

我认为更好的方法是允许修改用户需要修改的表,并在需要时使用BEFORE触发器强制执行授权,这会在current_user不属于正确角色时抛出错误。

但是remember to use set search_path=... option in all functions that have anything to do with security


如果您想授权对某些表进行只读访问,那么它会变得更加复杂。您需要为这些表禁用select权限,并使用安全定义器函数创建API以访问所有数据。这将是一个怪物大小的API,非常难看,非常脆弱。或者,您需要为这些表禁用select权限,并使用create view with (security_barrier)为它们创建视图。也不漂亮。