22.5. Сценарий управления правами #

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

Где:

  • Суперпользователь — это суперпользователь Postgres Pro с полным набором прав.

  • metastore_admin — это администратор Postgres Pro AXE.

  • Администраторы A и B — это локальные администраторы групп пользователей, у которых есть доступ к объектам pgpro_metastore, связанным с этими группами.

    Права администраторам A и B предоставляет администратор Postgres Pro AXE, и эти администраторы могут предоставлять права аналитикам в каждой группе.

  • Аналитики A, B, C и D — пользователи, которые работают с OLAP-данными.

Чтобы настроить этот сценарий управления правами:

  1. Создайте пользователей Postgres Pro от имени суперпользователя.

    Пример 22.7.

    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;

  2. Создайте схемы для групп пользователей.

    Пример 22.8.

    postgres=# SELECT current_user;
    current_user
    --------------
    root
    postgres=# CREATE SCHEMA schema_a;
    postgres=# CREATE SCHEMA schema_b;

    Дальнейший сценарий будет основан на схеме schema_a. Для схемы schema_b выполняются такие же шаги.

  3. Предоставьте ролям metastore_admin и admin_a права на схему schema_a.

    Пример 22.9.

    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;

  4. Предоставьте роли metastore_admin права на схему metastore и назначьте её Postgres Pro AXE администратором:

    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';
  5. Повторно запустите сервер Postgres Pro.

Теперь администратор Postgres Pro AXE может настроить каталог метаданных.

Пример 22.10.

postgres=> SELECT current_user;
  current_user
-----------------
metastore_admin
postgres=> SELECT metastore.define_catalog_connection('localhost','5433','postgres', '', '');
postgres=> SELECT metastore.init();

Если в схеме группы A есть таблица-куча и OLAP-данные из этой таблицы необходимо использовать для аналитических запросов в Postgres Pro AXE:

  1. Администратор Postgres Pro AXE создаёт хранилище и аналитическую таблицу.

    Пример 22.11.

    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');

  2. Администратор Postgres Pro AXE предоставляет роли admin_a право на аналитическую таблицу.

    Пример 22.12.

      postgres=> SELECT current_user;
        current_user
      -----------------
      metastore_admin
      postgres=# SELECT metastore.mgrant('ALL','TABLE','mt_table1','admin_a', TRUE);

  3. Роль admin_a теперь может скопировать OLAP-данные из таблицы-кучи в аналитическую таблицу и создать представление Postgres Pro для этой таблицы.

    Пример 22.13.

      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');

  4. Как владелец аналитической таблицы, администратор Postgres Pro AXE должен разрешить роли admin_a предоставлять право другим ролям.

    Пример 22.14.

      postgres=> SELECT current_user;
        current_user
      -----------------
      metastore_admin
      postgres=> GRANT SELECT ON schema_a.mt_table1 TO admin_a WITH GRANT OPTION;

  5. Теперь роль admin_a может предоставлять право другим ролям:

    Пример 22.15.

      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;

  6. В итоге роль analyst_a может выполнять команду SELECT над аналитической таблицей.

      postgres=> SELECT current_user;
      current_user
      --------------
      analyst_a
      (1 row)
    
      postgres=> SELECT COUNT(*) FROM schema_a.mt_table1;
      count
      -------
          50
      (1 row)