PostgreSQL: создать пользователя и выдать права
В PostgreSQL пользователя создают командой CREATE ROLE ... LOGIN, затем выдают только нужные права на базу, схему и таблицы. Не используйте суперпользователя для приложения; пароли и команды с секретами не храните в истории shell или репозитории.
Создать роль и базу для приложения
CREATE ROLE app_user LOGIN PASSWORD 'replace-with-a-secret';
CREATE DATABASE app_db OWNER app_user;Если база уже создана другим владельцем, выдайте права явно:
-- Подключитесь к базе app_db перед выдачей прав на её схему и таблицы.
GRANT CONNECT ON DATABASE app_db TO app_user;
GRANT USAGE ON SCHEMA public TO app_user;
GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES IN SCHEMA public TO app_user;
GRANT USAGE, SELECT ON ALL SEQUENCES IN SCHEMA public TO app_user;Выполняйте команды с правами владельца базы/объектов. Права на текущие таблицы не распространяются автоматически на будущие таблицы.
Права для будущих таблиц
CREATE ROLE app_owner;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA public
GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES TO app_user;
ALTER DEFAULT PRIVILEGES FOR ROLE app_owner IN SCHEMA public
GRANT USAGE, SELECT ON SEQUENCES TO app_user;FOR ROLE app_owner должен совпадать с ролью, которая будет создавать объекты. Выполните настройку отдельно для каждой роли-создателя.
Возможность | Команда |
|---|---|
Подключиться к базе |
|
Использовать схему |
|
Читать/изменять текущие таблицы |
|
Права на будущие объекты |
|
Почему пользователь не видит таблицу?
Проверьте CONNECT на базу, USAGE на схему и SELECT на нужную таблицу. Убедитесь, что запрос идёт к правильной базе и схеме.
Как отозвать доступ?
Используйте REVOKE для конкретного объекта и проверьте наследуемые права роли. Удаление роли потребует сначала переприсвоить или удалить принадлежащие ей объекты.