--- title: Data sandbox examples --- # Пример песочниц данных [Песочницы данных (ограниченный доступ к данным)](./data-sandboxes.md) - это набор разрешений, позволяющих ограничивать пользователям доступ к различным данным в зависимости от их пользовательских атрибутов. Вы сможете: - Запрещать доступ к **строкам**, используя [базовые возможности песочницы](./data-sandboxes.md#basic-data-sandboxes-filter-by-a-column-in-the-table). - Запрещать доступ к **столбцам**, используя [индивидуально настроив песочницу под свою задачу](./data-sandboxes.md#custom-data-sandboxes-use-a-saved-question-to-create-a-custom-view-of-a-table). Настройка разрешений - это всегда утомительно, так что здесь мы даем несколько примеров, с чего вы можете начать. В примере рассматривается группа *Customers*, но всё это будет аналогично работать и с любой другой. ## Простая настройка песочницы В этом примере мы поместим в песочницу таблицу _Orders_ так, что любой пользователь в группе _Customers_ будет видеть только те строки этой таблицы, в которых значение в колонке `User ID` соответствует пользовательскому атрибуту`user_id`. Первым делом, мы должны убедиться, что пользователь в нашем примере имеет атрибут, который мы сможем использовать в создаваемом фильтре: ![User details](images/edit-user-details.png) Потом перейдем в _**Панель Администрирования > Разрешения**_ и кликнем на _**Просмотр таблиц**_ рядом с _Sample Database_, чтобы увидеть разрешения, которые есть у наших групп пользователей в отношении таблиц этой базы данных. Мы хотим дать группе _Customers_ ограниченный доступ к таблице _Orders_, поэтому кликаем на соответствующей клетке в таблице разрешений и выбираем _Grant sandboxed access_. ![Grant sandboxed access](images/grant-sandboxed-access.png) Первым делом Glarus BI спросит нас, хотим ли мы установить этой группе пользователей ограниченный доступ к этой базе данных. Это означает, что у них не будет полного доступа ко всем таблицам этой базы данных, что, собственно, нам и нужно. ![Confirm modal](images/change-access-confirm-modal.png)Далее появится форма с вопросом, как мы хотим фильтровать таблицу для этих пользователей. Оставим значение по умолчанию. Ниже расположена область, где мы можем добавить наши фильтры. Мы хотим фильтровать данные по условию равенства значения в колонке `User ID` таблицы *Orders* и атрибута `user_id`, назначенного каждому пользователю. Для этого выберем эту колонку и этот пользовательский атрибут из выпадающих меню. Внизу экранной формы будут отображаться введенные нами параметры. ![Sandbox settings](images/select-user-attribute.png) Нажимаем кнопку **Готово**, потом - **Сохранить изменения** в верхней части экрана, чтобы сохранить внесенные нами изменения. Если в будущем понадобится изменить то, как эта таблица должна фильтроваться для пользователей данной группы, просто кликнем на выпадающем списке **Data access** для этой группы и выберем **Edit sandboxed access**. Чтобы проверить, правильно ли мы всё настроили, откроем новое окно браузера в режиме инкогнито и войдем в систему, используя тестовый аккаунт. Кликнем на *Sample Database* на главной странице, потом выберем таблицу *Orders*. Как видите, всё работает правильно: этот пользователь видит только те заказы, где поле `User ID` равно 1, потому что у этого пользователя именно такое значение атрибута `user_id`. ![Filtered table](images/filtered-table.png) Если этот пользователь формирует какие-либо диаграммы (_charts_), информационные панели (_dashboards_) или автоматизированные рентгеновские исследования (_X-ray explorations_), включающие в себя данные с ограниченным доступом из таблицы *Orders*, то данные для их построения будут также соответствующим образом отфильтрованы, чтобы показать только те из них, к которым пользователю разрешен доступ. При этом использование данных с ограниченным доступом не лишает пользователя возможности пользоваться всеми возможностями GlarusBI для исследования и визуализации доступных ему данных. Например, он может создать подобную диаграмму, показывающую разбивку своих заказов по типам продуктов: ![Filtered pie chart](images/filtered-pie-chart.png) ## Песочница с индивидуальными настройками Как было сказано выше, второй способ - это создание песочницы с использованием сохраненного вопроса, чтобы определить, в каком виде отображать таблицу. Когда пользователь с ограниченным доступом к таблице обращается к ней с запросом - для него источником данных будет "за кадром" не таблица, а этот сохраненный вопрос. ### Пример 1: скрываем колонки В этом примере у меня есть таблица *People* и я хочу, чтобы пользователи из группы *Marketing* могли просматривать ее содержимое, но не видели столбцы с персональной информацией. ![Original People table](images/advanced-example-1-people-table.png) Для этого я создам запрос, которые вернет только те столбцы из этой таблицы, которые я хочу, чтобы они видели, а именно: ![Filtering question](images/advanced-example-1-filtering-question.png) Теперь, перейдя в раздел **Разрешения** и назначив этой группе ограниченный доступ к этой таблице, я выберу вторую опцию и укажу сохраненный вопрос, который я только что создал: ![Sandbox options](images/advanced-example-1-sandbox-modal.png) Чтобы проверить, что всё настроено правильно, зайдем в систему под тестовым пользователем из группы *Marketing*. Открыв таблицу *People*, убедимся, что отображается не полное ее содержимое, а результаты фильтрующего вопроса: ![Sandboxed results](images/advanced-example-1-results.png) **Примечание:** такая фильтрация также произойдет, когда пользователь с ограниченным доступом попытается просмотреть график, использующий данные из таблицы в песочнице. Если график использует данные из столбцов, не входящих в "песочную" версию таблицы, то для этого пользователя он построен не будет. ### Пример 2: использование переменных в сохраненном вопросе Для создания более мощных и гибких фильтров, вы можете в фильтрующих вопросах вместе с пользовательскими атрибутами использовать переменные. В этом примере я предоставлю пользователям некоторой группы доступ к таблице *Orders*, указав доступные им столбцы, а также сделаю так, что они будут видеть только те строки, где значение в столбце `Customer ID` будет равно пользовательскому атрибуту `customer_id`. Вот таблица, которую я собираюсь отфильтровать: ![Original Orders table](images/advanced-example-2-orders-table.png) Я создам фильтрующий вопрос, который позволит мне скрыть от пользователей нужные колонки, а в добавленном разделе `WHERE` будет указана переменная `cid`, на которую я потом смогу ссылаться в своей песочнице. Вот как это будет выглядеть: ![Filtering question](images/advanced-example-2-filtering-question.png) Код фильтрующего вопроса: ``` SELECT id, created_at, product_id, quantity, total, user_id FROM orders WHERE user_id = {%raw%}{{cid}}{%endraw%} ``` Вернемся назад в раздел **Разрешения**, откроем форму настроек ограниченного доступа и выберем вторую опцию. Выбрав написанный нами фильтрующий вопрос, увидим дополнительную секцию настроек, где сможем связать переменную, указанную в созданном запросе, с пользовательским атрибутом: ![Sandboxing options](images/advanced-example-2-sandboxing-options.png) Значение моего пользовательского атрибута определено как указано на фото ниже. Эту форму мы можем открыть, нажав на кнопку с тремя точками рядом с именем нужного пользователя в разделе *People*: ![User attributes](images/advanced-example-2-user-attributes.png) Теперь, войдя в систему под этим именем пользователя и открыв таблицу `Orders`, я увижу только те колонки, которые были указаны в фильтрующем вопросе, и они отфильтрованы по условию, указанному в `WHERE`: ![Results](images/advanced-example-2-results.png) ## Дополнительная документация - [Basic sandboxes: setting row-level permissions](https://www.metabase.com/learn/permissions/data-sandboxing-row-permissions) - [Custom sandboxes: limiting access to columns](https://www.metabase.com/learn/permissions/data-sandboxing-column-permissions) - [Configuring permissions for different customer schemas](https://www.metabase.com/learn/permissions/multi-tenant-permissions)