为 Postgres 中的特定数据库授予默认权限

Grant default privileges for specific database in Postgres

我有一个名为 funnycode 的数据库。我还有一个名为 funnycode_user.

的用户

如何向 funnycode_user 授予默认权限,以便用户可以:

  1. 在名称 funnycode 下创建一个数据库。
  2. 用户可以连接到名称为 funnycode 的任何未来数据库,但不能连接到其他数据库。
  3. 用户可以 select 从所有表中访问任何未来数据库中名为 funnycode 的所有序列,但不能访问其他数据库。

这在 Postgres 中可行吗?如果是这样,如何?我read the documentation here,但我不明白这是怎么回事:

ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT INSERT ON TABLES TO funnycode_user;

绑定到一个特定的数据库,在我的例子中是 funnycode 数据库?

创建数据库的用户自动拥有该数据库(除非指定了不同的所有者),因此自动拥有数据库的所有权限。您不需要任何额外的授权来使该用户能够在数据库中创建和使用表。

因此,如果您授予 funnycode_user create database 权限,他可以创建 任何他想要的 数据库,而不仅仅是 funnycode。没有办法阻止这种情况。

自动创建的每个新数据库都会将 connect 权限授予角色 public。如果您不希望 funnycode_user 连接到其他数据库,您需要撤销每个数据库的 public 角色的权限。

另一种限制特定用户访问特定数据库的方法是通过 pg_hba.conf

您需要这样的条目:

# TYPE  DATABASE        USER              ADDRESS        METHOD
host    funnycode       funnycode_user    0.0.0.0/0      md5

条目0.0.0.0/0表示funnycode_user可以从任何IP地址连接。即使 funnycode_user 创建了其他数据库,他也无法连接到它们。


我认为更好(更干净)的方法是给该用户创建数据库的权限。只需创建该数据库一次,让 funnycode_user 成为所有者即可。

例如作为超级用户 运行:

create user funnycode_user password 'VerySecret';
create database funnycode owner = funnycode_user;

您只需要这样做一次(或在 funnycode_user 决定删除数据库之后)并且您不需要授予 funnycode_user 创建数据库的权限。