Привет Хабр! Меня зовут Белков Евгений, я руководитель направления разработки Siebel CRM в Московском кредитном банке.
Сегодня я хочу поделиться своим опытом разграничения содержимого страницы для разных пользователей.
Задача 1: Скрыть часть таблицы
Вводные данные
Есть некая таблица с результатами аудита сотрудников, которая состоит из большого перечня навыков. И добавлю себя в таблицу, это позволит мне потом настроить видимость. Представим себе такую таблицу:
Передо мной стоит задача разграничить содержание страницы в Confluence таким образом, чтобы сотрудник видел лишь те записи в таблице, которые относятся к его команде. если сотрудника в таблице нет, то видно все записи.
Далее у нас есть 2 варианта для реализации:
Сделать все на основе самой таблицы - это не сильно гибко, но зато быстро и легко решается.
Сделать дополнительно таблицу доступов, (тут важно определить целую матрицу, что довольно-таки сложно, но зато позволит сделать очень жесткой методику отображения данных.
Давайте разберем оба варианта по очереди и поймем, что нам больше всего подходит для реализации конкретной задачи.
Сразу отмечу, что основная работа будет проводиться с макросом Table Transformer, который достаточно подробно разбирал в предыдущей статье https://habr.com/ru/companies/mkb/articles/766696/. Так что если сразу не получилось понять, о чем речь, советую начать с нее.
Вариант 1
1.1.1. Первое, что нам необходимо сделать - это обернуть нашу таблицу Макросом Table Transformer.
1.1.2 Теперь при редактировании макроса определяем запрос, который поможет нам выбрать нужные записи. Давайте напишем его.
При Сохранении либо предварительном просмотре видим такую картину: Выбрались все записи Команды 2, так как я сам в ней нахожусь.
1.1.3 Отлично, но не идеально, так как если зайдет сотрудник, которого в данной таблице нет, например, мой руководитель, то он увидит некрасивую запись:
Давайте это исправлять. Первое что приходит на ум - это ввести новую колонку-индикатор, которую будем заполнять значением для простоты выборки.
При сохранении видим, что справа появилась новая колонка no_show, которая заполняется 1 для записей, которые нам не нужно отображать.
1.1.4 Давайте обернем запросом, чтобы выбрать только те записи, у которых новый параметр no_show=0
При таком синтаксисе, который обычно работает без проблем в любом SQL Developer в Confluence, здесь приводит к ошибке:
1.1.5 Не отчаиваемся, так как это легко можно обыграть новой оберткой макросом Table Transformer, то есть простыми словами - конструкцию Select from Select мы реализуем с помощью Table Transformer in Table Transformer:
Возвращаем запрос к виду из п. 1.3 погружаем в новый макрос Table Transformer с таким запросом и проверяем.
Видим, что у меня доступны только записи с моей команды.
1.1.6 Теперь давайте проверим вариант, когда на страницу заходит пользователь, которого в таблице нет, просто изменим мне ФИО в таблице, и получаем полную таблицу со всеми командами.
Отличный результат, но теперь у нас остаются 2 проблемы:
Можно увидеть оригинальную таблицу в режиме редактирования. И это убирается легко, с помощью ограничения редактирования страницы.
Появилось лишнее поле, которое нам в отображении не нужно.
Убираем его в Фильтр -> Cкрыть cтолбцы
Вариант 2 (сделать дополнительно таблицу доступов)
1.2.1 Чуть-чуть усложним нашу задачу, давайте представим, что один сотрудник находится в 2-х командах, и добавим новую Команду 3.
Теперь сотрудника будем вносить через @, чтобы не ошибаться в ФИО. Это важно, поскольку необходимо явно и четко раздать доступы пользователям заведенным в Conflunce, а не кому попало.
Мы уже видели в предыдущем варианте, что введенное от руки ФИО делает выборку невалидной.
Добавим матрицу доступов (см ниже вторую таблицу), где мы каждому пользователю определим список команд, которые он может видеть. Ни больше ни меньше.
1.2.2. Пишем запрос, в котором парсим команды. В данном случае у нас 2 команды, поэтому мы явно разбиваем поле Команда на 2, по разделителю ";"
Проверяем и видим, что отображаются только команды 1 и 2, команда 3 не доступна. Все как мы и хотели.
1.2.3. Но в перспективе может быть больше, например, и 5 и 20, и тут у нас сразу возникает вопрос: "Как это сделать просто и не писать 20 строк формата?":
T1.'Команда' in (select T2.'Команда'->split(";")->n from T2 Where T2.'ФИО' = @CURRENTUSER), где n - номер в разбивании колонки от 0 до 19.
К сожалению, кроме как писать какую-то сложную функцию тут не обойтись. Поэтому лучше раскопировать несколько строк формата выше, для того чтобы один раз это реализовать и забыть.
Задача 2: Скрыть часть страницы
Следующая задача - это ограничение не табличных данных, а например, текста.
Тут при реализации есть несколько вариантов в зависимости от задачи:
Скрыть страницу целиком для определенного списка сотрудников.
Скрыть часть страницы для всех.
Скрыть часть страницы для списка сотрудников.
Пройдемся поподробнее по всем пунктам.
2.1 Скрыть страницу целиком для определенного списка сотрудников.
2.2 Скрыть часть страницы для всех.
Первое, что может прийти в голову это Макрос Выборка, внутрь которой закладываем нужный нам текст, таблицы, макросы и ставим галку "Скрыть выбранное содержимое"
После сохранения данная выборка не будет видна вообще никому, но при редактировании она останется и будет доступна для изменения. Таких выборок вы можете сделать несколько на одной странице, НО учтите момент, что Макрос Вставка выборки поддерживает страницы только с одной выборкой страницы!
2.3 Скрыть части страницы для списка сотрудников
К сожалению, "из коробки" Confluence нет возможности скрыть часть страницы для определенного пользователя, но мы всегда можем пользоваться теми функциями, которые нам доступны: это пункты 1 и 2.
Создаем отельную страницу с необходимым нам текстом, оборачивать макросом Выборка не обязательно.
Настраиваем на ней ограничения доступа для конкретного списка пользователей, или, например, группы пользователей.
Редактируем целевую страницу, в которой используем макрос Включить страницу и добавляем страницу из п.1. Этот макрос позволяет отображать все содержимое соседней страницы в актуальном состоянии, то есть это как ссылка на любую страницу из Confluence.
Сохраняем. Теперь у пользователя, у которого не будет доступа к ВКЛЮЧЕННОЙ через макрос странице, будет частично ограниченное отображение. Ниже показано как это будет выглядеть - у кого есть права и у кого нет, соответственно:
Заключение
Confluence - очень гибкий инструмент при должном умении крутить макросы.
Можно быстро и корректно разграничить данные как страницы, так и записей таблицы для пользователей.
Многие скажут, что это все костыли, но иногда необходимо сделать то, чего не хватает инструменту, как говорится "из коробки" и главное, что это сделать можно!
От готового продукта уровня Confluence ожидается более широкий спектр функционала, так как всегда найдутся задачи, которые могут сломать голову.
Спасибо за прочтение. И удачи вам в ограничении данных.