14.2. Сценарий управления правами #
Рассмотрим сценарий управления правами, в котором они предоставляются по иерархии: от главного администратора локальным администраторам групп пользователей и аналитикам (обратитесь к диаграмме ниже).
Где:
Суперпользователь — это суперпользователь Postgres Pro с полными правами.
metastore_admin— главный администратор с рольюmetastore_admin, который является владельцем всех объектов pgpro_metastore.Администраторы A и B — это локальные администраторы групп пользователей, у которых есть доступ к объектам pgpro_metastore, связанным с этими группами.
Права этим администраторам предоставляет главный администратор. Локальные администраторы в свою очередь могут предоставлять права аналитикам в рамках своих групп.
Аналитики A, B, C и D — пользователи, которые работают с OLAP-данными.
Чтобы настроить этот сценарий управления правами:
Создайте пользователей в базе данных от имени суперпользователя:
postgres=# SELECT current_user; current_user -------------- root postgres=# CREATE USER metastore_admin; postgres=# CREATE USER admin_a; postgres=# CREATE USER admin_b; postgres=# CREATE USER analyst_a; postgres=# CREATE USER analyst_b; postgres=# CREATE USER analyst_c; postgres=# CREATE USER analyst_d;
Создайте аналитические схемы для групп пользователей:
postgres=# SELECT current_user; current_user -------------- root postgres=# CREATE SCHEMA schema_a; postgres=# CREATE SCHEMA schema_b;
Предоставьте пользователю
admin_aправа на аналитическую схемуschema_a:postgres=# SELECT current_user; current_user -------------- root postgres=# GRANT ALL ON SCHEMA schema_a to metastore_admin WITH GRANT OPTION; postgres=# GRANT ALL ON SCHEMA schema_a to admin_a WITH GRANT OPTION;
Предоставьте пользователю
metastore_adminправа на аналитическую схемуmetastoreи сделайте его администратором:postgres=# SELECT current_user; current_user -------------- root postgres=# GRANT ALL ON SCHEMA metastore TO metastore_admin ; postgres=# ALTER SYSTEM SET duckdb.postgres_role TO 'metastore_admin';
Перезапустите сервер.
Теперь пользователь metastore_admin может настроить каталог pgpro_metastore:
postgres=> SELECT current_user;
current_user
-----------------
metastore_admin
postgres=> SELECT metastore.define_catalog_connection('localhost','5433','postgres','','');
postgres=> SELECT metastore.init();Предположим, в схеме группы A есть таблица Postgres Pro, которую для выполнения аналитических запросов необходимо перенести в pgpro_metastore:
Пользователь
metastore_adminсоздаёт хранилище и аналитическую таблицу:postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=> SELECT metastore.add_storage('mt_storage', 'file:///tmp/mt_storage/', 'file:///tmp/mt_storage/tmp_dir/'); postgres=> SELECT metastore.add_table('mt_table1', 'mt_storage', 'schema_a.pg_table');Пользователь
metastore_adminнаходит имя прокси-таблицы, оборачивающей созданную аналитическую таблицу, выполнив запрос в базе данных, которая содержит каталог pgpro_metastore, т.е. схемуaxe_catalog:SELECT proxy_table_name FROM axe_catalog.pga_proxy_table p JOIN axe_catalog.pga_table t ON p.proxy_table_id = t.proxy_table_id WHERE t.table_name = 'mt_table1'; proxy_table_name ------------------- t_mt_table1_00001 (1 row)
Дальнейшие шаги выполняются на сервере, где установлено расширение pgpro_metastore.
Пользователь
metastore_adminпредоставляет права пользователюadmin_a:postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=> GRANT ALL ON metastore.t_mt_table1_00001 TO admin_a WITH GRANT OPTION;
Параметр
WITH GRANT OPTIONпозволяет пользователюadmin_aпри необходимости предоставлять права другим пользователям.Пользователь
admin_aкопирует таблицу Postgres Pro в аналитическую таблицу и создаёт представление Postgres Pro:postgres=> SELECT current_user; current_user -------------- admin_a postgres=> SELECT metastore.copy_table('mt_table1', 'select * from schema_a.pg_table'); postgres=> SELECT metastore.create_view('mt_table1', 'schema_a');Заметьте, что пользователь, вызывающий функцию
copy_tableдолжен иметь достаточные права для выполнения запроса, переданного как параметр; в данном случае,admin_aдолжен иметь разрешение наSELECTиз таблицыschema_a.pg_table.Как владелец объекта пользователь
metastore_adminразрешает пользователюadmin_aпредоставлять права на чтение этого объекта другим пользователям:postgres=> SELECT current_user; current_user ----------------- metastore_admin postgres=> GRANT SELECT ON schema_a.mt_table1 TO admin_a WITH GRANT OPTION ;
Пользователь
admin_aпредоставляет аналитикам права на чтение представления Postgres Pro:postgres=> SELECT current_user; current_user -------------- admin_a (1 row) postgres=> GRANT USAGE ON SCHEMA schema_a to analyst_a; postgres=> GRANT SELECT ON schema_a.mt_table1 TO analyst_a;
Аналитик читает аналитическую таблицу:
postgres=> SELECT current_user; current_user -------------- analyst_a (1 row) postgres=> SELECT count(*) FROM schema_a.mt_table1 ; count ------- 50 (1 row)