如何尽可能轻松地创建具有有限权限的 PostgreSQL Web 应用程序用户?

如何尽可能轻松地创建具有有限权限的 PostgreSQL Web 应用程序用户?

现在有人有一种简单且相对快速的方法来实现以下目标吗:

我有一个 PostgreSQL 8.2.9 DBMS,其中包含几个(大约 10 个)不同的数据库,它们都用于各自的 Web 应用程序。这些数据库被分成不同的方案,当然,这些方案又分成不同的表。

我使用 postgres 超级用户连接到我的 Web 应用程序中的数据库。现在我想重新考虑我的安全概念,因此创建一个权限较低的用户,该用户只能执行以下操作:在所有数据库的所有表上执行 INSERT、DELETE、UPDATE 和 SELECT。这个用户是否可以访问所有数据库并不重要,我不想为所有 Web 应用程序创建单独的用户。

无论如何,应该有某种方法在创建用户后将这些权限授予用户,例如

授予选择、插入、更新、删除权限致新用户;

我只知道如何将这些权限授予单个表,但对于分布在 10 个数据库中的 10,000 多个表来说,这将是一次艰巨的任务。我读过一些关于读取 pg_tables 元表以获取所有表的列表的文章,但它在我的版本上不起作用。也许你也可以回答是否真的有一个 PostgreSQL 数据库,它高于所有数据库并包含有关所有数据库的元信息?!我只注意到每个数据库中都有一个名为 information_schema 的模式,它托管有关当前数据库的信息?!

非常感谢。

答案1

批量 GRANT/REVOKE 仅在 PostgreSQL 9.0+ 中可用。

相反,您可以创建位于以下位置的函数 pg_grant() 和 pg_revoke()http://blog.bhushangahire.net/2009/06/17/grant-privileges-to-all-tables-in-a-database-for-postgresql/

这两个函数的参数是:

  1. 用户角色
  2. 权限
  3. 对象名称,可以是模式。“%”影响所有对象
  4. 架构名称

您需要在每个数据库和每个架构上运行该命令。语法如下:

SELECT pg_grant('web_user','SELECT,INSERT,UPDATE,DELETE','%','public');

如果您愿意,您可以更改函数定义中的此行:

nspname = $4 AND

更改为:

nspname like $4 AND

为了能够将架构指定为通配符,但我还没有测试过。

相关内容