Всем привет! Зовут меня Виталий, автор тг канала Детектив данных про мой вкат в аналитику данных после 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)
Готово.
Данные ограничены, пользователь логин которого вы не внесли в таблицу «РЛС» при попадании на ваш дашборд увидит просто пустой дашборд, так как его юзернейм не попадает в условие и срабатывает фильтр.
Ваша задача лишь поддерживать актуальность вашей таблицы «РЛС» и вносить туда изменения и новых пользователей по запросу.

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