PostgreSQL выдача прав пользователю с учетом создаваемых в будущем объектов

Многие сталкиваются в PostgreSQL с тем, что выдав пользователю права на, например, таблицы в бд, на новые таблицы эти права не распространяются. Т.е., если мы выдаем права на update на все таблицы в схеме public следующим образом:

GRANT UPDATE ON ALL TABLES IN SCHEMA PUBLIC TO testuser;

Потом создадим в схеме новую таблицу, то пользователь не будет иметь прав выполнять update на этой новой таблице. Та же ситуация и с другими объектами бд (функции, sequence-ы и т.д.).
Для того, чтобы решить эту проблему, нужно изменить у пользователя права доступа по умолчанию ALTER DEFAULT PRIVILEGES

Допустим, мы создали нового пользователя testuser и от нас требуется выдать ему все права на схему public в БД testdb.

GRANT CONNECT ON DATABASE testdb TO testuser; --права на подключение к бд
GRANT ALL ON SCHEMA public TO testuser; --права на CREATE и USAGE
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TABLES TO testuser; --права на таблицы
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON SEQUENCES TO testuser; --права на sequence-ы
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON FUNCTIONS TO testuser; --права на функции
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT ALL ON TYPES TO testuser; --права на типы

Теперь testuser может создавать таблицы и другие объекты в схеме public. А так же будет иметь права на созданные другими пользователями (например, владельцем бд) объекты.
REVOKE выполняется так же.

Важно! Если при выдаче или отзыве прав указать не конкретного пользователя а роль PUBLIC, например так:

ALTER DEFAULT PRIVILEGES IN SCHEMA testschema GRANT SELECT ON TABLES TO PUBLIC;

То все пользователи получат права select таблиц в этой схеме.

Так же рекомендуется для безопасности отзывать все права у роли PUBLIC на всех базах:

REVOKE ALL ON schema public FROM public;
0

Добавить комментарий

Ваш e-mail не будет опубликован.