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

时间:2018-10-25 20:30:05

标签: postgresql privileges

我有一个名为funnycode的数据库。我还有一个叫funnycode_user的用户。

如何为funnycode_user授予默认特权,以便用户可以:

  1. 创建名为funnycode的数据库。
  2. 用户可以连接到名称为funnycode的任何将来的数据库,但不能连接到其他数据库。
  3. 用户可以从所有表中进行选择,并可以访问名称为funnycode的任何未来数据库上的所有序列,但不能访问其他数据库。

在Postgres中有可能吗?如果是这样,怎么办?我read the documentation here,但看不到如何:

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

是否绑定到特定的数据库(在我的情况下是funnycode数据库?

1 个答案:

答案 0 :(得分:1)

创建数据库的用户自动拥有该数据库(除非指定了其他所有者),因此自动拥有该数据库的所有特权。您不需要任何其他授权即可使该用户创建和使用数据库中的表。

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

每个新创建的数据库都会自动向角色connect授予public特权。如果您不希望funnycode_user连接到其他数据库,则需要从每个数据库的公共角色撤消该特权。

限制特定用户对特定数据库访问的另一种方法是通过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创建数据库的权限。