自动允许用户访问postgres中的表

时间:2014-10-30 05:16:53

标签: postgresql permissions database-migration

我有一个用于Web应用程序的Postgresql数据库。数据库由系统上的特定用户拥有,我们说foouser。作为所有者,此用户拥有数据库的完全权限。

服务器还有另一个用户,让我们说webappuser,这是运行应用服务器的用户。我想使用" peer"而不是在Web应用程序的配置文件中指定用户名和密码。认证。我已经使身份验证正常工作,但我遇到了以下问题。

当我在Postgresql中创建webappuser角色时,我授予了LOGIN权限以及GRANT ALL ON DATABASE foo TO webappuser;权限以及数据库GRANT ALL ON SCHEMA public TO webappuser;

我遇到的问题是表权限。与MySQL不同,如果你有权访问数据库,默认情况下允许访问所有表(我认为这是一个合理的假设),即使已经对模式和数据库给出了许可,Postgresql也拒绝访问所有表。为了解决这个问题,我必须明确授予我使用GRANT ALL ON TABLE table_name TO webappuser;创建的所有新表,视图,过程等的权限(对于视图等也是如此)。

最终,每当我运行数据库迁移时,我都必须为创建的新表添加数据库的权限。问题是我无法将此权限信息添加到迁移本身,因为开发人员计算机没有其他用户。在任何情况下,这看起来都是错误的做事方式。

如何在不需要每次创建表,视图,过程等的情况下进行手动干预的情况下,如何允许此附加用户访问数据库表?

奖励积分:有没有办法将用户的权限限制为仅使用CRUD操作而不是完全权限,并且仍会自动执行整个操作?

1 个答案:

答案 0 :(得分:4)

没有Laravel迁移细节的经验:当您在同一台服务器上进行迁移时,只要权限也被迁移,因为webappuser在群集范围内可用。

迁移到其他服务器时,您需要在该新服务器上创建用户并为所有迁移的对象设置权限。你基本上有两种方法可以做到这一点。

第一种是在迁移之前为架构中的表设置默认权限,或者在迁移之后设置GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA sch_name TO webappuser。默认权限设置为:

ALTER DEFAULT PRIVILEGES IN SCHEMA sch_name
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO webappuser;

这两个命令完全符合SQL标准,因此在兼容架构中应该没有问题。

请记住,在同一架构中创建的任何其他表也将具有为webappuser设置的权限。在生产环境中不建议为“不受信任”的用户(使用Web应用程序的人)设置权限,因为潜在的权限泄漏;在开发环境中,它可能是可以接受的。

第二个 - 我个人赞成 - 是编写一个设置适当权限的存储过程。进行迁移,运行存储过程一次,您就应该正常运行。这使您可以更好地控制权限授予。程序可能类似于:

CREATE FUNCTION grant_webapp_privileges() RETURNS void AS $$
  -- Create the webappuser, if necessary
  CREATE ROLE webappuser LOGIN;

  -- Grant privileges on all required objects
  GRANT SELECT, INSERT, UPDATE, DELETE ON TABLE table1 TO webappuser;
  ...
$$ LANGUAGE SQL;

在master数据库中,您只需在创建或删除新关系时使存储过程保持最新。如果Laravel支持插入不在要迁移的模式中的代码块,则可以使上述过程成为迁移后执行的匿名代码块。

(顺便说一句,我从不给webappuser - 像CRUD访问角色。相反,我总是通过隐藏一些基础数据模型细节的视图提供访问权限,例如person有{ {1}},address和其他详细信息;视图可以在一个大行中提供。这样您就可以轻松更改基础关系并更新视图,而不必调整Web应用程序。相同的原则真的是OOP,更容易管理权限。)