Предоставить права по умолчанию для конкретной базы данных в Postgres - PullRequest
0 голосов
/ 25 октября 2018

У меня есть база данных под названием funnycode.У меня также есть пользователь с именем funnycode_user.

Как предоставить права по умолчанию для funnycode_user, чтобы пользователь мог:

  1. Создать базу данных под именем funnycode.
  2. Пользователь может подключаться к любой будущей базе данных с именем funnycode, но не к другим базам данных.
  3. Пользователь может выбирать из всех таблиц и имеет доступ ко всем последовательностям в любой будущей базе данных вимя funnycode, но не другие базы данных.

Возможно ли это в Postgres?Если так, то как?Я прочитал документацию здесь , но я не вижу, как это:

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

Связано с конкретной базой данных, в моем случае это будет база данных funnycode?

1 Ответ

0 голосов
/ 26 октября 2018

Пользователь, который создает базу данных, автоматически владеет этой базой данных (если не указан другой владелец) и, таким образом, автоматически обладает всеми привилегиями в базе данных.Вам не нужно никаких дополнительных грантов, чтобы пользователь мог создавать и использовать таблицы в базе данных.

Таким образом, если вы предоставите 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 право создавать базы данных.

...