我正在编写一个带有postgresql 9.2数据库后端的C ++应用程序。这是一个会计软件。它是具有权限分离功能的多用户应用程序。
我需要帮助来实现用户帐户系统。用户的权限不必相互排斥。我应该在应用程序级别还是在数据库级别实现它?
目前公司规模不大。假设约有15-20个办事处,每个办公室平均有10个计划用户。
欢迎所有建议和论点。
答案 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)
为它们创建视图。也不漂亮。