Перейти к основному содержимому

RLS

RLS (Row Level Security) - самый детальный уровень доступа. Он позволяет пользователям видеть разные данные в одних и тех же графиках, в зависимости от их учётной записи.

RLS

Политика настройки доступа: ограничивающая. Вы указываете пользователей / ГП, которым нужно ограничить доступ.

Например, есть такой простой отчёт по продажам:

Отчет по продажам

И вам нужно сделать, чтобы региональные менеджеры видели только свои продажи, а остальных пользователей не ограничивать.

Для этого мы переходим в менеджер данных и настраиваем нашу модель. При наведении на модель данных в панели нажимаем на иконку настройки доступа:

Модель

В первую очередь будет рассмотрен один из вариантов реализации данного функционала. После этого будут разъяснены принципы его работы, а также представлены доступные возможности.

В качестве примера будет использоваться поле «Регион» из справочника «Магазины».

Пример реализации:

Пример реализации

Создаём правило и называем его:

Наименование правила

После чего открывается окно настройки правила RLS

Окно РЛС

Блоки Пользователи и Группы отвечают за тех, на кого мы накладываем ограничение на данных.

Блок Переменные позволяет привязать пользователям / ГП их значения для дальнейшего использования в условии отображения отдельных строк данных.

Блок Фильтр – непосредственно описывает правило.

Первым шагом добавляем пользователей, которых мы хотим ограничить в данных: например, региональные менеджеры.

Региональные менеджеры

Все прочие пользователи никак не будут ограничены.

Затем создаём переменную manager_regions. Значение по умолчанию – пустая строка .

Создание переменной

После чего задаём пользователям их значения. Выбираем moscow_manager и прописываем его регион Москва. 

Значения должны с точностью совпадать с теми, что лежат в данных.

Пользователи

Для rostov_manager значение, соответственно, Ростов.

подсказка

И, наконец, само правило: WHERE shops.region in ( {{manager_regions}} )

Проверим, как работает правило.

Так это выглядит у обычного пользователя, для которого нет правила:

Пример графика

Так это выглядит под пользователем moscow_region:

Пример 2

Видим, что значения всех графиков изменились, в фильтре остался только регион Москва, а рейтинг, помимо фильтрации по Москве, автоматически перешёл на следующий уровень drill_down – сразу до магазинов.

По rostov_manager аналогично:

пример 3

Как это работает?

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

WHERE shops.region in ( {{manager_regions}} )

На основании текущей учётной записи вместо всех переменных подставляются их значения. На примере менеджера Московских магазинов это

WHERE shops.region in ( ‘Москва’ )

Таким образом каждый из перечисленных пользователей будут видеть только свои данные. Все прочие по умолчанию видят все данные.

Какие ещё есть возможности RLS?

В форме настройки правила вы пишете произвольный SQL (язык структурированных запросов), ограничиваясь лишь его синтаксисом и своим воображением. Важно лишь помнить о том, что переменные – это простая подстановка значений, а также о кавычках, когда работаете с текстовыми значениями.

В нашем случае мы сразу заложили логику, когда под управлением одного менеджера может быть несколько регионов, поэтому используется оператор IN. В простом случае можно использовать WHERE shops.region = {{manager_region}}

Разберём несколько вариаций нашей задачи:

  • Если в справочнике магазинов уже прописан их менеджер, правило можно описать следующим образом WHERE shops.manager = {{manager}}, задав предварительно значения переменной для каждого менеджера
  • Если у вас более сложная иерархия, например менеджеры магазинов и региональные менеджеры

Иерархия

Хорошим вариантом будет создать 2 правила: для обычных менеджеров и для региональных. Их логика схожа с п.1. В этом случае для каждого из них будет работать своё правило.

Также можно описать всё в одном:

  • описываем 2 переменные: manager и region_manager. У обычных менеджеров будет заполнена только первая, у региональных – вторая. Например, у Смирнова (магазин М10)

2

3

  • фильтр задаём выражением WHERE manager = '{{manager}}' or region_manager = '{{region_manager}}'

Таким образом, у Смирнова фильтр примет вид: WHERE manager = 'Смирнов' or region_manager = '' А т.к. пустых региональных менеджеров в данных нет, он увидит данные только по своему магазину.

Мы разобрали несколько бизнес-кейсов, теперь рассмотрим технические возможности:

  1. Можно задавать несколько правил на одну и ту же модель данных. Если один пользователь фигурирует в несольких правилах, для него будут применены все ограничения
  2. Правила можно экспортировать/импортировать в csv/xlsx. Помогает переносить логику между проектами

Экспорт

У разработчиков проекта есть возможность тестировать работу RLS, не запрашивая доступы пользователей и не создавая тестовые УЗ. Для этого предусмотрен предпросмотр RLS – просто включите его в настройках проекта и выберите пользователя, под которым хотите проверить работу правил.

Это сильно сократит время отладки. В целях безопасности предпросмотр RLS работает только для администраторов, а также разработчиков, не ограниченных настроенными правилами.