Всем привет! Зовут меня Виталий, автор тг канала Детектив данных про мой вкат в аналитику данных после 35.

Сегодня мы рассмотрим достаточно нестандартное и простое решение, как ограничить доступ к любому вашему дашборду (или данных в нём) на Суперсете, зная лишь емейл или логин пользователя, без использования стандартных не самых удобных прав пользователя «зашитых» в Superset.

Для этого нам понадобится лишь подкорректировать SQL запрос, добавив туда лишь небольшое выражение шаблонизатора Jinja.

Пример дашборда
Пример дашборда

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

Чтобы проверить работает ли у Вас Jinja достаточно выполнить самый простой запрос:

SELECT
'{{ current_username() }}';

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

В моём случае юзернейм пользователя совпадает с электронной почтой до @, но встречал вариант и где юзернейм был равен почте.

Дальше этого нам понадобится еще одна таблица с логинами пользователей и со значениями на основе которых мы хотим фильтровать. Назовём её для простоты таблицей «РЛС»

для каждого логина мы прописали какие данные пользователь должен увидеть если мы ограничиваем видимость по Региону
для каждого логина мы прописали какие данные пользователь должен увидеть если мы ограничиваем видимость по Региону

Саму таблицу можно готовить как вам удобно - в моей реализации это была экселька в которой руководителями регионов были заполнены емейлы пользователей дашборда. Далее таблица через единожды написанный питон скрипт обрабатывалась, выделялся логин, таблица трансофмировалась в нужный мне формат и закидывалась на ахд. В случае добавления новых емейлов - весь процесс занимал буквально 5-10 секунд. закинуть эксельку в папку и нажать "Run All"

Вернёмся снова к нашему запросу

Ниженаписанный код вернёт массив значений из нашей таблицы «РЛС» для конкретного пользователя:

WITH user_values AS (
  SELECT 
  values 
  FROM 
    aous_gb.rls_table_data_office 
  WHERE 
    code_user = '{{ current_username() }}'
) 
SELECT 
  * 
FROM 
  user_values

Теперь путём редактирования источника добавляем условие WHERE в наш основной код, где мы фильтруем данные из основной таблицы по столбцу region или type массивом значений из нашей временной таблицы

Так же емейлы руководителей в таблице "РЛС" имели значение "all", чтобы видеть вообще весь дашборд без каких либо ограничений

WITH user_values AS (SELECT values
FROM aous_gb.rls_table_data_office 
WHERE code_user = '{{ current_username() }}')

SELECT *
FROM aous_gb.sales_data_rls i
WHERE
i."region" IN (SELECT values FROM user_values)
OR i."type" IN (SELECT values FROM user_values)
-- OR 1=1
OR 'all' = ANY (SELECT values FROM user_values)

Готово.

Данные ограничены, пользователь логин которого вы не внесли в таблицу «РЛС» при попадании на ваш дашборд увидит просто пустой дашборд, так как его юзернейм не попадает в условие и срабатывает фильтр.

Ваша задача лишь поддерживать актуальность вашей таблицы «РЛС» и вносить туда изменения и новых пользователей по запросу.

Дашборд ограниченный для Московского региона
Дашборд ограниченный для Московского региона

Спасибо за просмотр, пишите комментарии и заходите в гости в ТГ канал Детектив данных.

Комментарии (0)