Предоставление доступа ко всем таблицам для пользователя

Я новичок в Postgres и пытаюсь перенести наши базы данных MySQL. В MySQL я могу предоставить привилегии SELECT, UPDATE, INSERT и DELETE для пользователя с низкой привилегией и включить эти гранты для применения ко всем таблицам в указанной базе данных. Я должен что-то пропускать в Postgres, потому что похоже, что я должен предоставлять эти привилегии для каждой таблицы по одному за раз. Со многими базами данных и сотнями таблиц на базу данных, которые кажутся сложной задачей только для того, чтобы выйти из-под земли. Кроме того, как только база данных работает, добавление таблиц происходит достаточно часто, чтобы я не хотел предоставлять разрешения каждый раз, если это абсолютно необходимо.

Как это лучше всего выполнить?

114 голосов | спросил PlaidFan 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 07:27:09 +0400000000amFri, 01 Feb 2013 07:27:09 +040013 2013, 07:27:09

5 ответов


145

Во-первых, вы должны иметь возможность подключаться к базе данных для запуска запросов. Это может быть достигнуто с помощью

REVOKE CONNECT ON DATABASE your_database FROM PUBLIC;

GRANT CONNECT
НА БАЗЕ ДАННЫХ database_name
TO имя_пользователя;

REVOKE необходим потому что

  

Ключевое слово PUBLIC указывает, что привилегии должны быть предоставлены   все роли, включая те, которые могут быть созданы позже. PUBLIC может быть   как неявно определенная группа, которая всегда включает в себя все   роли. Любая конкретная роль будет обладать суммой предоставленных привилегий   прямо к нему, привилегии, предоставленные любой роли, в настоящее время   член и привилегии, предоставленные PUBLIC.

Если вы действительно хотите ограничить свой пользователь заявлениями DML, вам нужно сделать еще немного:

REVOKE ALL
ПО ВСЕМ ТАБЛИЦАМ В СХЕМЕ
ОТ ОБЩЕСТВЕННОСТИ;

GRANT SELECT, INSERT, UPDATE, DELETE
ПО ВСЕМ ТАБЛИЦАМ В СХЕМЕ
TO имя_пользователя;

Они предполагают, что у вас будет только одна схема (которая по умолчанию называется public).

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

ALTER DEFAULT PRIVILEGES
    FOR ROLE some_role - альтернативно "FOR USER"
    IN SCHEMA общественная
    GRANT SELECT, INSERT, UPDATE, DELETE ON TABLES К user_name;

Здесь some_role - это роль, которая создает таблицы, а user_name - тот, кто получает привилегии. Определив это, вы должны войти в систему как some_role или его член.

И, наконец, вы должны сделать то же самое для последовательностей (спасибо PlaidFan за указание его) - вот вам нужна привилегия USGE.

ответил dezso 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 16:36:08 +0400000000pmFri, 01 Feb 2013 16:36:08 +040013 2013, 16:36:08
45

при условии, что вы хотите предоставить им все привилегии - сделайте следующее:

предоставить все привилегии для базы данных dbname для dbuser;

где dbname - это имя вашей базы данных, а dbuser - имя пользователя.

ответил alxkls 1 FebruaryEurope/MoscowbFri, 01 Feb 2013 15:52:11 +0400000000pmFri, 01 Feb 2013 15:52:11 +040013 2013, 15:52:11
12

Возможно, я делал что-то не так, потому что я очень новичок в PostgreSQL. Но это только разрешило первую часть проблемы для меня - установление привилегий для всех существующих таблиц.

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

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, INSERT, UPDATE, DELETE ON tables TO имя_пользователя;

ALTER DEFAULT PRIVILEGES IN SCHEMA public
  GRANT SELECT, ИСПОЛЬЗОВАНИЕ последовательностей TO user_name;
ответил Will 21 PM00000090000003131 2014, 21:26:31
8

Предоставление всех привилегий для всех таблиц в базе данных достигается с помощью

ГРАНТ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ ТАБЛИЦЕ В СХЕМЕ <schema_name> TO <имя_пользователя & gt ;;
ГРАНТ ВСЕ ПРИВИЛЕГИИ НА ВСЕХ ПОСЛЕДОВАНИЯХ В СХЕМЕ <schema_name> TO <имя_пользователя & gt ;;
ответил Nomadme 7 +03002017-10-07T01:10:34+03:00312017bEurope/MoscowSat, 07 Oct 2017 01:10:34 +0300 2017, 01:10:34
0
- Создать пользователя

СОЗДАТЬ ПОЛЬЗОВАТЕЛЯ my_user_test С ВХОДОМ NOSUPERUSER NOCREATEDB NOCREATEROLE INHERIT NOREPLICATION CONNECTION LIMIT -1 PASSWORD 'xxxxxxx';

- Грант подключиться к моей базе данных

GRANT CONNECT ON DATABASE my_db_test TO my_user_test;

- Использовать схему использования схемы

Использование GRANT на SCHEMA my_sch_test TO my_user_test;

- Предоставить всю таблицу для SELECT, INSERT, UPDATE, DELETE

GRANT SELECT, INSERT, UPDATE, DELETE ON ALL TABLES В SCHEMA my_sch_test TO my_user_test;
ответил Jorge Valenzuela 3 PMpTue, 03 Apr 2018 15:25:53 +030025Tuesday 2018, 15:25:53

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132