我有一个名为funnycode
的数据库。我还有一个叫funnycode_user
的用户。
如何为funnycode_user
授予默认特权,以便用户可以:
funnycode
的数据库。funnycode
的任何将来的数据库,但不能连接到其他数据库。funnycode
的任何未来数据库上的所有序列,但不能访问其他数据库。在Postgres中有可能吗?如果是这样,怎么办?我read the documentation here,但看不到如何:
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT INSERT ON TABLES TO funnycode_user;
是否绑定到特定的数据库(在我的情况下是funnycode
数据库?
答案 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创建数据库的权限。