Ошибка «Отказано в разрешении для таблицы foo», даже если разрешения были предоставлены - PullRequest
1 голос
/ 28 апреля 2019

Я вошел в свою базу данных как владелец базы данных (в том числе суперпользователь) и создал роль role_write с флагами nologin и noinherit.

Я отменил разрешения на создание по умолчанию для публикисхема с:

REVOKE CREATE ON SCHEMA public FROM PUBLIC;

и аннулировал публичный доступ к базе данных с:

REVOKE ALL ON DATABASE mydb FROM PUBLIC;

Я предоставил роли для каждой таблицы. Я хочу, чтобы эта роль имела права на чтение и запись,Используя таблицу user для этого примера, я добавил:

grant insert, select, update, delete on users to role_write;

Затем я также дал пользователю надлежащие разрешения для таблиц, схемы, последовательностей и подключения к базе данных и изменил привилегии по умолчанию с помощью:

GRANT CONNECT ON DATABASE my to role_write;
grant usage on schema public to role_write;
grant select, insert, update, delete on all tables in schema public to role_write;
grant usage, select on all sequences in schema public to role_write;
alter default privileges in schema public
   grant select, insert, update, delete on tables to role_write;
alter default privileges in schema public
   grant usage, select on sequences to role_write;

Я также создал нового пользователя (с флагом noinherit) и добавил к нему роль role_write с помощью:

grant role_write to newuser;

Затем я вошел в систему как этот пользователь, выполнив команду:

set role role_write;

Затем, чтобы быть в безопасности, я перезапустил postgres.

Но даже после всего этого, когда я пытаюсь подключиться к базе данных через сервер sequelize / apollo как newuser и запуститьзапрос, я получаю ошибку:

permission denied for table users

Я понятия не имею, что я сделал не так.Если я проверяю привилегии пользовательской таблицы, это показывает, что role_write настроен правильно.

Любая помощь?

EDIT: Итак, я понял, что мне нужно запуститьset role role_write на каждом сеансе, а не только один раз.Если я подключаюсь к базе данных и сразу же запускаю запрос, я получаю сообщение об ошибке, однако, если я сначала задаю роль, то это позволяет мне.

Так что мой вопрос сейчас ...

Как мне получить sequelize / apollo для добавления set role role_write; для каждого нового соединения с базой данных?

Ответы [ 2 ]

0 голосов
/ 29 апреля 2019

Все, что вам нужно сделать, это

ALTER ROLE role_write INHERENT;

Тогда каждый член роли автоматически унаследует свои привилегии, и запускать SET ROLE.

не нужно.
0 голосов
/ 28 апреля 2019

УВАЖАЕМЫЕ ЛЮДИ ИЗ БУДУЩЕГО: Вот что мы выяснили до сих пор ...

Как объяснено в моем редактировании, проблема в том, что я создал newuser с флагом noinherit. Это вызывает проблему при использовании sequelize / apollo, поскольку единственный способ получить права на чтение / запись от роли role_write - это сначала запустить set role role_write;.

Возможно, кто-то ответит решением, позволяющим отправлять set role role_write; с каждым запросом sequelize / apollo на сервер, но сейчас я решил проблему, просто запустив alter role newuser with inherit;. Теперь я больше не получаю сообщение об ошибке.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...