PostgreSQL: доступ к таблицам, принадлежащим другому пользователю

Как суперпользователь, я создал две роли в Postgres по одной и той же схеме:

  1. read_only_with_create_view
  2. read_write

Затем я создал двух пользователей из каждой роли:

  1. read_only_with_create_view_user
  2. read_write

Теперь read_write_user не может получить доступ к любым новым представлениям, созданным read_only_with_create_view_user, поскольку у представлений другой владелец (read_only_with_create_view_user).

Так как же получить доступ ко всем новым представлениям read_write_user?

Я хочу, чтобы все, что создано одним пользователем, было доступно другому пользователю.

Шаги, которые я выполнил:

CREATE ROLE read_only_role WITH
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity';

GRANT CONNECT ON DATABASE mydb to read_only_role;
GRANT USAGE,CREATE ON SCHEMA myschema TO read_only_role;
GRANT SELECT ON ALL TABLES IN SCHEMA myschema TO read_only_role;
GRANT SELECT ON ALL SEQUENCES IN SCHEMA myschema TO read_only_role;

CREATE USER read_only_with_create_view_user
WITH PASSWORD '*****'
in ROLE read_only_role;

-- Now created new views using this role. That means read_only_with_create_view_user is owner of those views.

-- Creating new read-write role. 

CREATE ROLE rw_role WITH
NOSUPERUSER INHERIT NOCREATEDB NOCREATEROLE NOREPLICATION VALID UNTIL 'infinity' IN ROLE read_only_role;

GRANT CONNECT ON DATABASE mydb to rw_role;

GRANT USAGE ON SCHEMA myschema TO crn_rw_role_qa;
GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA myschema TO rw_role;
GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA myschema TO rw_role;

CREATE USER read_write_user
WITH PASSWORD '*****'
in role rw_role;

После входа в систему с помощью read_write_user, когда я пытаюсь получить доступ к новым представлениям, созданным read_only_with_create_view_user, я получаю эту ошибку:

ERROR:  permission denied for relation view_name
********** Error **********

ERROR: permission denied for relation view_name
SQL state: 42501

person Himanshu Parmar    schedule 22.05.2017    source источник


Ответы (1)


Вы можете установить роль в качестве члена другой роли:

GRANT read_only_with_create_view_user TO read_write_user; 

Подробнее здесь.


ИЗМЕНИТЬ

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

введите здесь описание изображения

Роль read_write_user не может получить доступ к объектам, принадлежащим read_only_with_create_view_user, просто потому, что у них нет никаких отношений. Чтобы это работало так, как вы ожидаете, вы можете переназначить владение объектами роли «верхнего» уровня, в данном случае: read_only_role (поскольку все являются членами этой роли). Но имейте в виду, что эта роль больше не будет доступна только для чтения.

Вы можете сделать одно из следующих действий:

--Connected as read_only_with_create_view_user
CREATE VIEW my_view AS SELECT 1;

--Assign ownership to top-level role
ALTER VIEW my_view OWNER TO read_only_role;

Или вы можете предпочесть этот подход:

--Connected as read_only_with_create_view_user
--Change current user to read_only_role
SET role = read_only_role;

--Create a view...
CREATE VIEW my_view AS SELECT 1;

--Turn back to read_only_with_create_view_user
RESET role;

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

REASSIGN OWNED BY read_only_with_create_view_user TO read_only_role;

Наконец, если вы не хотите нарушать свое правило только для чтения, вы также можете, конечно, дать разрешение непосредственно объекту.

-- As read_only_with_create_view_user, execute the following:
CREATE VIEW my_view_2 AS SELECT 1;
GRANT SELECT ON my_view_2 TO read_write_user
person Michel Milezzi    schedule 22.05.2017
comment
Я уже пробовал таким образом при создании роли с синтаксисом создать роль .... в роли .... но все же новые представления, созданные read_only_with_create_view_user, недоступны для read_write_user. В нем говорится: ОШИБКА: отказано в разрешении для отношения view_name ********** Ошибка ********** ОШИБКА: отказано в разрешении для отношения view_name Состояние SQL: 42501 - person Himanshu Parmar; 22.05.2017
comment
Вы должны показать свои попытки. Обновите свой вопрос с помощью команд, которые вы ввели. - person Michel Milezzi; 23.05.2017
comment
Также проверьте, есть ли у ваших ролей атрибут INHERIT. - person Michel Milezzi; 23.05.2017
comment
Я обновил исходный вопрос с точными этапами создания роли и создания пользователя. - person Himanshu Parmar; 23.05.2017
comment
Спасибо, Мишель, за подробное объяснение. - person Himanshu Parmar; 24.05.2017
comment
Поправьте меня, если я ошибаюсь. Если вы переназначите право собственности на read_only_role, эта так называемая роль только для чтения может делать с объектом все, что захочет, даже удалять его. Так что это больше не роль только для чтения. Итак, как обеспечить доступ только для чтения к объекту, принадлежащему другой роли/пользователю? - person franta kocourek; 04.03.2020