Как создать пользователя с правами только для чтения для всех баз данных в Postgresql? - PullRequest
19 голосов
/ 23 июня 2011

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

GRANT select ON DATABASE dbname to user1;

Но я получил следующую ошибку:

ERROR:  invalid privilege type SELECT for database

Когда я гуглил людей, советовали сделать операцию grant select для всех таблиц. Но новые таблицы добавляются всегда. Так что это не приемлемое для меня решение. Кто-нибудь знает какие-нибудь обходные пути?

Ответы [ 4 ]

24 голосов
/ 23 ноября 2011

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

Обратите внимание, что предоставление доступа к "TABLES" включает в себя представления, но не включает последовательности (например, функцию автоинкрементации для столбцов "SERIAL"), поэтому вам, вероятно, также потребуется предоставить доступ к ним.

Ниже предполагается, что вы хотите сделать все в схеме public. Оператор ALTER DEFAULT PRIVILEGES может действовать на всю базу данных, опуская предложение IN SCHEMA ...; GRANT необходимо запустить один раз для каждой схемы.

-- Grant access to current tables and views
GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
-- Now make sure that's also available on new tables and views by default
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT
ON TABLES 
TO user1;

-- Now do the same for sequences
GRANT SELECT, USAGE ON ALL SEQUENCES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES
    IN SCHEMA public -- omit this line to make a default across all schemas
    GRANT SELECT, USAGE
ON SEQUENCES 
TO user1;

Руководство по PostgreSQL

22 голосов
/ 23 июня 2011

Вы не можете сделать это на уровне базы данных, только на уровне схемы.

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

GRANT SELECT ON ALL TABLES IN SCHEMA public TO user1;
ALTER DEFAULT PRIVILEGES IN SCHEMA public GRANT SELECT ON TABLES TO user;
4 голосов
/ 23 июня 2011

Я понимаю, что вы уже сказали, что это неприемлемый ответ, но в любом случае это правильный ответ.

Указание безопасности (GRANT и REVOKE) является частью разработки и тестирования таблицы.

Не перемещайте таблицы в производство, пока определения таблиц, безопасность, тесты и тестовые данные не находятся под контролем версий.

Сказав это, PostgreSQL не имеет каких-либо разрешений SELECT для баз данных. Вы можете предоставлять только разрешения CREATE, CONNECT или TEMP для баз данных.

Вы можете предоставить SELECT для всех таблиц в данной схеме. Я не знаю, как это влияет на таблицы, созданные после выполнения оператора GRANT, но это довольно легко проверить.

Синтаксис PostgreSQL Grant

3 голосов
/ 05 октября 2012

Для версий Postgres ниже 9.0:

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || tablename || ' TO USER;' 
FROM pg_tables WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || viewname || ' TO USER;' 
FROM pg_views WHERE schemaname = 'public'" | psql -d DBNAME

psql -d DBNAME -qAt -c "SELECT 'GRANT SELECT ON ' || relname || ' TO USER;' 
FROM pg_statio_all_sequences WHERE schemaname = 'public'" | psql -d DBNAME
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...