Как предоставить доступ нескольким пользователям к одной и той же строке в Data Studio для баз данных, отличных от BigQuery? - PullRequest
0 голосов
/ 02 августа 2020

Чтобы включить безопасность на уровне строк, я использовал вариант Filter By Email, как предлагалось здесь . Но я хочу знать, могу ли я включить доступ к одной строке для нескольких пользователей, а также как включить суперпользователей, которые могут видеть все строки. Например, если ниже приведены образцы данных, тогда я хочу иметь другой вывод в зависимости от того, кто вошел в систему.

userId  age email
A       20  usera@gmail.com
B       15  userb@gmail.com
C       25  userc@gmail.com
Z       30  admin@gmail.com

Когда A вошел в систему

userId  age email
A       20  usera@gmail.com

Когда B вошел в систему

userId  age email
A       20  usera@gmail.com
B       15 userb@gmail.com

Когда Z вошел в систему

userId  age email
A       20  usera@gmail.com
B       15  userb@gmail.com
C       25  userc@gmail.com
Z       30  admin@gmail.com

Update1: Я использую postgres экземпляр для отчетов (не bigQuery), поэтому решение, использующее @DS_USER_EMAIL, не будет работать

1 Ответ

1 голос
/ 02 августа 2020

Фильтр по электронной почте просто предоставляет вам адрес электронной почты текущего зарегистрированного пользователя. Вы должны использовать его для фильтрации своего запроса. Я разработал такой простой тест:

with sample as (
  select "a" as userId, 10 as age, "usera@gmail.com" as email
  UNION ALL
  select "b" as userId, 20 as age, "userb@gmail.com" as email
  UNION ALL
  select "c" as userId, 30 as age, "userc@gmail.com" as email
), auth as (
  select "usera@gmail.com" as user, "usera@gmail.com" as permission
  UNION ALL
  select "userb@gmail.com" as user, "usera@gmail.com" as permission
  UNION ALL
  select "userb@gmail.com" as user, "userb@gmail.com" as permission
  UNION ALL
  select "admin@gmail.com" as user, ".*" as permission
)
select * from sample
where REGEXP_CONTAINS(email,(select STRING_AGG(permission,"|") from auth where auth.user = @DS_USER_EMAIL))

У меня есть таблица sample с вашими данными. Я создал таблицу auth со ссылкой между электронной почтой пользователя и авторизацией просмотра.

В последнем запросе я использую регулярное выражение, чтобы проверить, авторизована ли строка или нет. У администратора есть значение .* для просмотра всех данных. Другой - это просто агрегирование всех строк, разделенных вертикальной чертой | (ИЛИ на языке регулярных выражений)

EDIT

Сила BigQuery - это соответствие со стандартом SQL2011, и рабочий запрос в postgres аналогичен. Для шаблона регулярного выражения используйте SIMILAR TO. Посмотрите на шаблон регулярного выражения администратора, это не обычное регулярное выражение, но оно работает

string_agg - это существующая функция

with sample as (
  select 'a' as userId, 10 as age, 'usera@gmail.com' as email
  UNION ALL
  select 'b' as userId, 20 as age, 'userb@gmail.com' as email
  UNION ALL
  select 'c' as userId, 30 as age, 'userc@gmail.com' as email
), auth as (
  select 'usera@gmail.com' as user, 'usera@gmail.com' as permission
  UNION ALL
  select 'userb@gmail.com' as user, 'usera@gmail.com' as permission
  UNION ALL
  select 'userb@gmail.com' as user, 'userb@gmail.com' as permission
  UNION ALL
  select 'admin@gmail.com' as user, '%' as permission
)
select * from sample
where email SIMILAR TO (select STRING_AGG(permission,'|') from auth where auth.user = @DS_USER_EMAIL)

Запрос работает, но его нельзя использовать с Datastudio, потому что @DS_USER_EMAIL существует только с BigQuery

Обходной путь - использовать Cloud SQL федеративный запрос . И последний запрос - это сочетание обоих движков db

with sample as (
SELECT * FROM EXTERNAL_QUERY("gbl-imt-homerider-basguillaueb.us.vertx-postgres", """ select 'a' as userId, 10 as age, 'usera@gmail.com' as email
  UNION ALL
  select 'b' as userId, 20 as age, 'userb@gmail.com' as email
  UNION ALL
  select 'c' as userId, 30 as age, 'userc@gmail.com' as email""")), auth as (
SELECT * FROM EXTERNAL_QUERY("gbl-imt-homerider-basguillaueb.us.vertx-postgres", """ select 'usera@gmail.com' as user, 'usera@gmail.com' as permission
  UNION ALL
  select 'userb@gmail.com' as user, 'usera@gmail.com' as permission
  UNION ALL
  select 'userb@gmail.com' as user, 'userb@gmail.com' as permission
  UNION ALL
  select 'admin@gmail.com' as user, '.*' as permission"""))
select * from sample
where REGEXP_CONTAINS(email,(select STRING_AGG(permission,"|") from auth where auth.user = @DS_USER_EMAIL))
...