Изменение привилегий по умолчанию для групповой роли в PostgreSQL

Я создал две групповые роли в Postgres 9.2: один называется admins, а другой называется readers.

Идея очень проста: admins создать таблицы и readers иметь доступ на чтение к этим таблицам.

После предоставления привилегий обеим ролям группы все работало как ожидалось для объектов exisintg. Но как насчет новых объектов?

Итак, прочитав этот пост, я изменил привилегии по умолчанию, чтобы предоставить SELECT привилегии readers для любой новой таблицы, которая admins create:

ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON TABLES TO readers;
ALTER DEFAULT PRIVILEGES FOR ROLE admins IN SCHEMA public GRANT SELECT ON SEQUENCES TO readers;

Но, по-видимому, ALTER DEFAULT PRIVILEGES влияет только на роль, а не на роль этой роли. Позвольте мне показать вам.

Если я вхожу в качестве userX (член admins) и создаю новую таблицу, не предоставляются привилегии по умолчанию (и, следовательно, readers не может получить доступ к этой таблице):

test=# CREATE TABLE table1 (name VARCHAR(10)); -- Creating table as userX
test=# \dp table1
                           Access privileges
 Schema |  Name  | Type  | Access privileges | Column access privileges 
--------+--------+-------+-------------------+--------------------------
 public | table1 | table |                   | 

Однако привилегии по умолчанию предоставляются, если я создаю таблицу как admins (readers может получить доступ к этой таблице):

test=# SET ROLE admins;
test=# CREATE TABLE table2 (name VARCHAR(10)); -- Creating table as admins
test=# \dp table2
                             Access privileges
 Schema |  Name  | Type  |   Access privileges   | Column access privileges 
--------+--------+-------+-----------------------+--------------------------
 public | table2 | table | readers=r/admins     +| 
        |        |       | admins=arwdDxt/admins | 

Есть ли способ изменить привилегии по умолчанию для ВСЕХ членов групповой роли? Или я должен просто изменять привилегии по умолчанию для каждого пользователя?


ОБНОВЛЕНИЕ: В этом форуме PostgreSQL кто-то задал очень похожий вопрос, и ответ был:

К сожалению, я не вижу способа добиться желаемого, не предоставляя привилегии по умолчанию всем, кто участвует.

Однако этот вопрос задавали 2 года назад. Есть ли решение сейчас?

Ответы

Ответ 1

Если пользователь создает таблицу, этот пользователь становится владельцем таблицы. Поэтому в вашем случае применяются любые привилегии по умолчанию для userX, а не админы. решение должно быть SET ROLE admins перед созданием вашей таблицы:

SET ROLE admins;
CREATE TABLE ... -- This now applies default privileges of admins
;
RESET ROLE;

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

Cheers, Патрик