JDBC-коннектор
Можно брать в работу
Бизнес-требования
Основные требования к фиче:
- Добавить подключение диспетчере данных – JDBC-коннектор
- Возможность добавлять новые коннекторы к любой СУБД прямо из интерфейса системы
- Возможность управлять параметрами подключения через конфигурацию источника
- Обеспечить безопасность соединения
- Сохранить логику взаимодействия с микросервисами бэкенда, просмотр статуса подключения
- Настроить логирование всех операций с JDBC-коннекторами
- Коннектор и нагрузка на него никак не должны влиять на производительность системы, при падении драйвера не должен падать основной поток FB
- В документации требуется добавить новый раздел, посвященный добавлению JDBC-драйвером и подключению по JDBC к внешним СУБД
План работ
- Управление драйверами (бэкенд)
- Подготовить каталог для хранения jar-файлов драйверов с правами доступа только для сервисов платформы; обеспечить резервное копирование этого каталога
- Настроить валидатор драйверов: проверить наличие обязательных мета-методов (getTables, getColumns, getImportedKeys, getColumnName, getColumnType, getScale, getColumnCount); обеспечить логирование результатов валидации
- Обеспечить регистрацию драйвера в реестре: записать тип, версию, хэш-сумму (?), дату загрузки, статус
- Настроить хранение лицензионных ключей драйверов БД; обеспечить проверку наличия лицензии при регистрации драйвера
- Управление драйверами (фронтенд)
- Реализовать интерфейс загрузки драйвера: выбор файла, ввод типа СУБД, версии, описания; обеспечить проверку файла
- Реализовать вывод списка доступных драйверов в интерфейсе настройки источников
- Конфигурация подключений (бэкенд)
- Настроить хранение учётных данных в хранилище с обратимым шифрованием; обеспечить передачу секретов микросервисам только в момент выполнения подключения
- Реализовать модуль тестирования подключения: при нажатии «Проверить» микросервисы пытаются установить соединение с внешней БД и выполнить пробный запрос; обеспечить возврат понятного сообщения об успехе или ошибке
- Реализовать поддержку параметров SSL: загрузка сертификата сервера, настройка взаимной аутентификации при необходимости; обеспечить проверку валидности сертификата при тестировании подключения
- Реализовать поддержку SSH-туннеля: ввод хоста, порта, логина, пароля или ключа; обеспечить создание туннеля перед установкой JDBC-соединения и его закрытие после завершения
- Конфигурация подключений (фронтенд)
- Реализовать форму создания источника данных: выбор драйвера из реестра, ввод JDBC URL, логина, пароля, настроек SSL/SSH; обеспечить маскировку пароля в интерфейсе
- Загрузка данных (бэкенд)
- Реализовать логику Cron: запуск загрузок по расписанию или событию; обеспечить передачу контекста выполнения в Blocker и обработку ошибок запуска
- Реализовать логику Blocker: проверка активной загрузки для того же источника; обеспечить установку и снятие блокировки, предотвращение параллельного импорта одной таблицы
- Реализовать логику Loader: чтение данных из внешней БД через JDBC-драйвер с учётом параметров подключения
- Настроить запись данных в ClickHouse
- Ролевая модель (бэкенд)
- Доступ к добавлению и валидации драйверов имеют только пользователи с ролью "Администратор системы"
- Доступ к созданию подключений имеют только пользователи с ролью "Разработчик" и выше
Интеграционная схема
Общие сценарии использования
| Use case | Зачем нужен |
|
Администратор взаимодействует с веб-интерфейсом
|
Точка входа для всех операций с драйверами
|
|
Интерфейс читает/записывает данные в реестр драйверов
|
Чтобы показать список доступных драйверов и сохранить новый
|
|
Интерфейс передаёт файл драйвера на валидацию
|
Проверка корректности .jar-файла перед сохранением
|
|
Валидатор сохраняет проверенный файл в хранилище
|
Физическое хранение драйверов на диске
|
|
Реестр передаёт список доступных типов драйверов во Слой 2
|
Чтобы дата-инженер видел только проверенные драйверы при создании источника
|
|
BI-разработчик запускает тест подключения
|
Проверка работоспособности настроек перед сохранением
|
|
BI-разработчик создаёт/редактирует конфигурацию подключения
|
Сохранение параметров: URL, порт, имя БД
|
|
BI-разработчик настраивает маппинг таблиц и полей
|
Определение, какие данные и как загружать из источника
|
|
Конфигурация ссылается на хранилище учётных данных
|
Пароли хранятся отдельно от конфигурации (безопасность)
|
|
Конфигурация ссылается на настройки SSL/SSH
|
Параметры защищённого соединения вынесены отдельно
|
|
Модуль тестирования вызывает микросервисы для проверки
|
Реальное подключение к БД выполняется через ETL-сервисы
|
|
Микросервисы читают параметры подключения
|
Чтобы знать, к какой БД подключаться
|
|
Микросервисы читают правила маппинга
|
Чтобы знать, какие таблицы и поля загружать
|
|
Хранилище передаёт учётные данные микросервисам
|
Логин/пароль для подключения к внешней БД
|
|
Настройки SSL/SSH передаются микросервисам
|
Для защищённого соединения с источником
|
|
Микросервисы читают данные из внешних БД через JDBC
|
Основной процесс ETL-загрузки
|
|
Микросервисы записывают данные в ClickHouse
|
Загрузка данных в БД проекта для аналитики
|
|
Микросервисы пишут логи загрузки
|
Отладка ETL-процессов, мониторинг ошибок
|
|
Валидатор пишет логи проверки драйверов
|
Аудит операций с драйверами, отладка проблем
|
Критерии приёмки
Обязательно проверить все сценарии использования в каждом разделе!
|
Критерий
|
Ожидаемый результат
|
|---|---|
|
Загрузка валидного драйвера
|
Файл .jar официального драйвера (PostgreSQL/MySQL) загружается, проходит валидацию, получает статус «Активен» и появляется в реестре.
|
|
Отклонение невалидного файла
|
Загрузка файла с расширением .txt, поврежденного архива или файла без манифеста отклоняется с ошибкой.
|
|
Блокировка драйвера с уязвимостями
|
Загрузка драйвера, хэш которого есть в черном списке, или содержащего запрещенные классы (JNDI, exec), блокируется.
|
|
Проверка мета-методов
|
Драйвер без обязательных методов (getTables, getColumns и т.д.) отклоняется.
|
|
Уникальность версии
|
Попытка загрузить драйвер с той же комбинацией Тип + Версия, что уже есть в реестре, отклоняется.
|
|
Обновление драйвера
|
При загрузке новой версии существующего драйвера (через редактирование) старый файл заменяется, метаданные обновляются, статус сбрасывается на проверку.
|
|
Удаление используемого драйвера
|
Попытка удалить драйвер, на который ссылается хотя бы один активный источник данных, блокируется с предупреждением.
|
|
Видимость для ролей
|
Вкладка «JDBC-драйверы» видна только Администратору системы. У остальных ролей вкладка скрыта.
|
|
Критерий
|
Ожидаемый результат
|
|---|---|
|
Создание подключения с валидным драйвером
|
Источник создается успешно, если выбран драйвер со статусом «Активен».
|
|
Блокировка при отсутствующем драйвере
|
Попытка создать источник с удаленным или заблокированным драйвером отклоняется.
|
|
Шифрование секретов
|
Пароли и SSH-ключи сохраняются в БД в зашифрованном виде. Прямой запрос к таблице возвращает зашифрованную строку.
|
|
Валидация JDBC URL
|
URL с запрещенными параметрами () отклоняется при создании/сохранении.
|
|
Тестирование обычного подключения
|
Кнопка «Проверить подключение» возвращает успех для корректных данных и понятную ошибку для неверного пароля/хоста.
|
|
Тестирование SSL-подключения
|
При включении SSL и загрузке корневого сертификата тест проходит только если сертификат валиден.
|
|
Тестирование SSH-туннеля
|
При включении SSH соединение устанавливается через туннель. После теста туннель гарантированно закрывается (проверка по сетевым сокетам).
|
|
Маскировка данных в UI
|
При редактировании существующего источника пароли и ключи не отображаются (поля пустые или маскированы).
|
|
Частичное обновление
|
При обновлении источника без изменения пароля старый зашифрованный пароль сохраняется неизменным.
|
|
Критерий
|
Ожидаемый результат
|
|---|---|
|
Запуск по расписанию
|
Задача запускается строго по расписанию Cron. В логах фиксируется старт задачи.
|
|
Блокировка параллельных запусков
|
Принудительный запуск второй загрузки того же источника, пока первая не завершена, блокируется (статус «Занято»).
|
|
Снятие блокировки при успехе
|
После успешной загрузки блокировка снимается немедленно. Следующий запуск возможен.
|
|
Снятие блокировки при ошибке
|
При падении Loader'а (exception) блокировка снимается автоматически по истечении TTL или через обработчик ошибок.
|
|
Чтение данных через JDBC
|
Loader успешно подключается к внешней БД (в т.ч. через SSH/SSL), выполняет выборку и читает данные.
|
|
Запись в ClickHouse
|
Данные корректно маппятся в типы ClickHouse и записываются в целевую таблицу. Количество строк совпадает с источником.
|
|
Идемпотентность
|
Повторный запуск загрузки с теми же данными не создает дубликатов строк в ClickHouse.
|
|
Критерий
|
Ожидаемый результат
|
|---|---|
|
Доступ Администратора системы
|
Полный доступ ко всем драйверам и источникам во всей системе.
|
|
Изоляция Администратора тенанта
|
Видит и управляет только источниками своего тенанта.
|
|
Ограничения Разработчика
|
Может создавать источники только в своих проектах. Не может загружать драйверы.
|
Решение
Управление драйверами
Системная логика (бэкенд)
План работ:
- Подготовить каталог для хранения jar-файлов драйверов с правами доступа только для сервисов платформы; обеспечить резервное копирование этого каталога
- Настроить валидатор драйверов: проверить наличие обязательных мета-методов; обеспечить логирование результатов валидации
- Обеспечить регистрацию драйвера в реестре: записать тип, версию, путь к файлу, хэш-сумму (?), дату загрузки, статус
- Настроить хранение лицензионных ключей драйверов в БД; обеспечить проверку наличия лицензии при регистрации драйвера
Реестр драйверов:
- Требуется обеспечить хранение jar-файлов в системном хранилище (например, в серверном хранилище)
- Требуется обеспечить хранение параметров драйверов в системном хранилище (например, в PG):
- id записи
- Путь к файлу драйвера в хранилище
- Тип – текст
- Версия СУБД – текст
- Описание – текст
- Статус – текст
- Требуются методы для:
- Передачи jar-файлов с фронтенда
- POST-запрос
- Передает в себе:
- Файл драйвера
- Тип – текст
- Версия СУБД – текст
- Описание – текст
- Должна быть выполнена проверка валидации файла (см. далее)
- Должна быть проверка на роль пользователя – только администратор системы
- Получения списка драйверов из хранилища
- GET-запрос
- Ничего не передает в себе
- Ожидает в ответ список параметров файлов:
- id записи из хранилища параметров
- Тип – текст
- Версия СУБД – текст
- Описание – текст
- Статус – текст
- Должна быть проверка на роль пользователя – только администратор системы
- GET-запрос
- Обновления jar-файлов в хранилище:
- PATCH-запрос (ну или PUT, просто стараюсь соблюсти REST)
- Передает в себе:
- id записи из хранилища параметров
- Может передавать в себе:
- Файл драйвера
- Тип – текст
- Версия СУБД – текст
- Описание – текст
- При перезаписи файла должна быть выполнена проверка валидации как при добавлении файла
- Если валидация пройдена, старый файл удаляется, вместо него добавляется переданный
- Должна быть проверка на роль пользователя – только администратор системы
- Удаления jar-файлов в хранилище:
- DELETE-запрос
- Передает в себе:
- id записи из хранилища параметров
- Удаляется и запись в хранилище параметров, и jar-файл в реестре драйверов согласно пути к файлу в хранилище параметров
- Должна быть проверка на роль пользователя – только администратор системы
- Передачи jar-файлов с фронтенда
Валидатор драйверов:
Валидатор проверяет загружаемый .jar-файл JDBC-драйвера перед регистрацией в реестре. Его цель – не допустить в систему некорректные, повреждённые или небезопасные файлы.
- Требуется метод для вызова валидации файла:
- POST-запрос
- Передаёт в себе jar-файл
- Должна быть проверка на роль пользователя – только администратор системы
- Метод обязательно вызывается при создании/редактировании драйвера
- Обязательно выполняются следующие проверки:
- Расширение файла = .jar
- MIME-тип = application/java-archive или application/zip
- Неповрежденная структура файла
- Размер файла < 100 MB
- Наличие манифеста META-INF/MANIFEST.MF
- Отсутствуют подозрительные классы
- Цифровая подпись файла валидна (при наличии)
- Хэш не в списке уязвимых
- Файл уникален в реестре драйверов
- Обязательно выполняются проверки на наличие следующих мета-методов:
- getTables,
- getColumns,
- getImportedKeys,
- getColumnName,
- getColumnType,
- getScale,
- getColumnCount
- Требуется защита от Java-инъекций (не должно быть ппропущено):
- Вредоносный класс в .jar-файле (класс с static {} блоком, выполняющим код)
- JNDI-инъекция через логи
- Выполнение команд на основе ввода
- SpEL, OGNL, JavaScript в конфиге
- Запрещенные параметры в JDBC URL:
- allowLoadLocalInfile=true
- allowMultiQueries=true
- autoDeserialize=true
- statementInterceptors
- connectionInitSql
- Дополнительно могут выполняться другие проверки для защиты при загрузке файлов
- В случае ошибки необходимо возвращать на фронтенд текст "Валидация файла не пройдена. Ошибка:" + текст системной ошибки
Чек-лист проверок файла:
|
Проверка
|
Критичность
|
|---|---|
|
Расширение файла = .jar
|
Критическая
|
|
MIME-тип = application/java-archive или application/zip
|
Критическая
|
|
Неповрежденная структура файла
|
Критическая
|
|
Размер файла < 100 MB
|
Критическая
|
|
Наличие манифеста META-INF/MANIFEST.MF
|
Критическая
|
|
Отсутствуют подозрительные классы
|
Подозрительная
|
|
Цифровая подпись файла валидна (при наличии)
|
Критическая
|
|
Хэш не в списке уязвимых
|
Критическая
|
|
Файл уникален в реестре драйверов
|
Критическая
|
|
Наличие мета-метода getTables
|
Критическая
|
|
Наличие мета-метода getColumns
|
Критическая
|
|
Наличие мета-метода getImportedKeys
|
Критическая
|
|
Наличие мета-метода getColumnName
|
Критическая
|
|
Наличие мета-метода getColumnType
|
Критическая
|
|
Наличие мета-метода getScale
|
Критическая
|
|
Наличие мета-метода getColumnCount
|
Критическая
|
|
Отсутствие вредоносных классов (static {} блок с кодом)
|
Критическая
|
|
Отсутствие JNDI-инъекций через логи
|
Критическая
|
|
Отсутствие выполнения команд на основе ввода
|
Критическая
|
|
Отсутствие SpEL, OGNL, JavaScript в конфиге
|
Критическая
|
|
Отсутствие параметра allowLoadLocalInfile=true в JDBC URL
|
Критическая
|
|
Отсутствие параметра allowMultiQueries=true в JDBC URL
|
Критическая
|
|
Отсутствие параметра autoDeserialize=true в JDBC URL
|
Критическая
|
|
Отсутствие параметра statementInterceptors в JDBC URL
|
Критическая
|
|
Отсутствие параметра connectionInitSql в JDBC URL
|
Критическая
|
|
Драйвер не содержит нативных библиотек (.so, .dll, .dylib)
|
Подозрительная
|
|
Отсутствует доступ к System.getenv() и System.getProperties()
|
Подозрительная
|
|
Отсутствуют исходящие сетевые вызовы (кроме БД)
|
Подозрительная
|
|
Отсутствует использование Reflection API для доступа к внутренним классам JVM
|
Подозрительная
|
|
Отсутствуют классы с обфусцированными именами (a, b, c, ...)
|
Подозрительная
|
|
Отсутствуют потоки/таймеры, которые остаются активными после закрытия соединения
|
Подозрительная
|
|
Отсутствует сериализация объектов через Serializable
|
Подозрительная
|
|
Отсутствуют вызовы ClassLoader.getSystemClassLoader()
|
Подозрительная
|
|
Отсутствует доступ к файловой системе за пределами /tmp
|
Подозрительная
|
|
Размер файла соответствует типичному для драйверов этой СУБД (не аномально большой)
|
Подозрительная
|
|
В архиве присутствуют файлы документации (LICENSE, README)
|
Подозрительная
|
|
Версия драйвера не является устаревшей (> 3 лет с момента выпуска)
|
Подозрительная
|
|
Отсутствуют deprecated JDBC-методы в использовании
|
Подозрительная
|
|
Отсутствует использование finalizer-методов
|
Подозрительная
|
|
Отсутствуют классы с именами, содержащими Hack, Exploit, Inject, Bypass
|
Подозрительная
|
- Если валидация пройдена (нет ни одной ошибки со статусом "Критическая"), то:
- В таблице параметров драйверов появляется новая запись с параметрами
- Записи присваивается статус в зависимости от результатов проверки:
- Если нет ни одной ошибки со статусом "Подозрительная" – статус "Активен"
- Если есть хотя бы одна ошибка со статусом "Подозрительная" – статус "Требует проверки"
- В реестр драйверов помещается файл драйвера
Пользовательский интерфейс
Расположение: Панель администратора → Настройки → Новая вкладка "JDBC-драйверы"
Вкладка доступна только пользователям с ролью "Администратор системы". Для всех остальных ролей вкладка отсутствует.
На вкладке:
- Кнопка "Добавить драйвер"
- Таблица драйверов, содержит в себе:
- Название драйвера
- Статус ("Принято" зеленого цвета, или "Требует проверки" желтого цвета)
- Версия СУБД
- Инфо
- При наведении на элемент списка появляются 2 кнопки: удалить ("корзина") и редактировать ("карандаш")
- Если в списке нет элементов, то нет и списка. В области остается только кнопка "Добавить драйвер"
При добавлении/редактировании драйвера открывается модальное окно:
- Название окна – "Добавление/редактирование драйвера"
- Поле ввода "Тип", по умолчанию пустое, обязательно для заполнения
- Поле ввода "Версия СУБД", по умолчанию пустое
- Область выбора файла с кнопкой "Выбрать файл"
- Кнопка "Добавить"
- Кнопка "Отмена"
Референс из AW BI:
При удалении драйвера появляется модальное окно с ошибкой:
- Название – "Удаление драйвера"
- Текст: "Вы уверены, что хотите удалить данный драйвер? Все существующие подключения, использующие драйвер для JDBC-подключений, не смогут обновлять данные"
- Кнопка "Удалить"
- Кнопка "Отмена"
Если драйвер не прошел валидацию, то появляется всплывающая ошибка при открытом окне создания/редактирования: "Валидация драйвера не пройдена: обнаружены критические нарушения безопасности или целостности файла"
Сценарии использования
Пользователь переходит на вкладку "JDBC-драйверы". В интерфейсе отображается список драйверов в виде раскрывающихся строк.
Пользователь нажимает на драйвер в списке. Раскрывается список параметров этого драйвера.
Пользователь нажимает на кнопку "Добавить драйвер". Открывается модальное окно добавления драйвера.
Пользователь нажимает в окне кнопку "Выбрать файл". Открывается filepicker для выбора файла с устройства. После выбора файл добавляется в окно в виде иконки файла с подписью в вдие названия файла. Кнопка "Выбрать файл" остается под файлом.
Пользователь нажимает в окне кнопку "Добавить". В случае успеха драйвер добавляется в список драйверов на вкладке. В случае, если не заполнены обязательные поля для заполнения, под ними появляется текст "Поле обязательно для заполнения", драйвер не создается, окно не закрывается. В случае ошибки появляется всплывающее сообщение с ошибкой с бэкенда, драйвер не создается, окно не закрывается.
Пользователь наводит курсор на драйвер в списке. Появляются кнопки удаления и редактирования.
Пользователь нажимает на кнопку удаления. Открывается модальное окно для удаления драйвера.
Пользователь нажимает в окне на кнопку "Удалить". Драйвер удаляется из списка.
Пользователь нажимает на кнопку "Редактировать". Открывается окно редактирования драйвера. Сценарий изменения аналогичен сценарию добавления драйвера.
Системная логика (фронтенд)
При переходе на вкладку "JDBC-драйверы" выполняется GET-запрос на получение списка драйверов с бэкенда. В ответ приходит массив параметров:
- id записи из хранилища параметров
- Тип – текст, подставляется в качестве названий элементов списка
- Версия СУБД – текст, подставляется в список параметров при раскрытии элемента списка
- Описание – текст, подставляется в список параметров при раскрытии элемента списка
- Статус – текст, подставляется в список параметров при раскрытии элемента списка
При выборе файла в окне добавления/редактирования открывается filepicker. Доступны для выбора только файлы с расширением .jar. Можно выбрать ровно один файл. При повторном выборе файла в том же окне заменять старый файл на новый.
При добавлении драйвера выполняется:
- POST-запрос на валидацию драйвера. Передает в себе только файл драйвера. Если в ответ получает ошибку валидации, то выводить всплывающее сообщение с ошибкой с бэкенда.
- Если валидация пройдена, то выполняется POST-запрос на отправку параметров драйвера. Передаются введенные пользователем данные:
- Файл драйвера
- Тип – текст
- Версия СУБД – текст
- Описание – текст
При редактировании драйвера выполняется:
- POST-запрос на валидацию драйвера. Передает в себе только файл драйвера. Если в ответ получает ошибку валидации, то выводить всплывающее сообщение с ошибкой с бэкенда.
- Если валидация пройдена, то выполняется PATCH-запрос, который передает в себе все измененные параметры.
При удалении драйвера выполняется DELETE-запрос, который передает в себе id удаляемого драйвера.
Конфигурация подключений
Системная логика (бэкенд)
- Настроить хранилище учётных данных с обратимым шифрованием; обеспечить передачу секретов микросервисам только в момент выполнения подключения
- Реализовать модуль тестирования подключения: при вызове метода микросервисы пытаются установить соединение с внешней БД и выполнить пробный запрос; обеспечить возврат понятного сообщения об успехе или ошибке
- Реализовать поддержку параметров SSL: прием сертификатов, настройка взаимной аутентификации; обеспечить проверку валидности сертификата при тестировании подключения
- Реализовать поддержку SSH-туннеля: прием параметров хоста, порта, логина, пароля или ключа; обеспечить создание туннеля перед установкой JDBC-соединения и его закрытие после завершения
- Обеспечить регистрацию подключения в реестре: записать имя, тип драйвера, URL, зашифрованные учетные данные, настройки SSL/SSH, статус
- id записи
- Имя подключения – текст
- ID драйвера – связь с реестром драйверов JDBC
- URL – текст
- Логин – текст
- Пароль – текст
- Настройки SSH:
- Имя хоста – текст
- Порт – число
- Логин – текст
- Пароль – текст
- Настройки SSL:
- Путь к файлу корневого сертификата
- Путь к файлу клиентского сертификата
- Путь к файлу с клиентским приватным ключом
- Дата последней проверки – дата/время
Также требуется хранить файлы:
- корневого сертификата
- клиентского сертификата
- с клиентским приватным ключом
- Создания подключения:
- POST-запрос
- Передает в себе:
- Имя подключения
- ID драйвера JDBC
- URL
- Логин
- Пароль
- Настройки SSL:
- activeSSL – логический тип, активно (true) или нет (false)
- Файл корневого сертификата
- Файл клиентского сертификата
- Файл с клиентским приватным ключом
- Настройки SSH:
- activeSSH – логический тип, активно (true) или нет (false)
- Имя хоста
- Порт
- Логин
- Пароль
- Должна быть выполнена проверка существования драйвера по ID
- Должна быть выполнена проверка валидации JDBC URL (отсутствие запрещенных параметров в URL)
- Должно быть выполнено шифрование пароля и чувствительных настроек перед сохранением
- Должна быть проверка на роль пользователя – администратор системы, администратор тенанта или разработчик
- Получения данных подключения:
- GET-запрос
- Передает в себе id источника
- Ожидает в ответ:
- Имя подключения
- ID драйвера JDBC
- URL
- Логин
- Настройки SSL:
- activeSSL – логический тип, активно (true) или нет (false)
- Настройки SSH:
- activeSSH – логический тип, активно (true) или нет (false)
- Имя хоста
- Порт
- Логин
- Тестирования подключения:
- POST-запрос
- Передает в себе:
- Параметры подключения (аналогично созданию, но без сохранения) ИЛИ
- id существующего подключения
- Должна быть выполнена попытка установки соединения
- Должна быть выполнена попытка выполнения пробного запроса
- В случае использования SSH должно быть создано и закрыто туннельное соединение
- Должен быть возвращен статус успеха или ошибка с текстом: "Не удалось установить соединение"
- Должна быть проверка на роль пользователя – администратор системы, администратор тенанта или разработчик
- Обновления подключения:
- PATCH-запрос
- Передает в себе:
- id записи
- Может передавать в себе любые поля для обновления (аналогично созданию)
- При передаче нового пароля или ключей должна выполняться их повторная шифровка
- Должна быть проверка на роль пользователя – администратор системы, администратор тенанта или разработчик
- Удаления подключения:
- DELETE-запрос
- Передает в себе id записи
- Удаляется запись из хранилища параметров
- Должна быть проверка на отсутствие активных задач ETL, использующих данное подключение
- Должна быть проверка на роль пользователя – администратор системы, администратор тенанта или разработчик
В ответ на запрос GET back/api/v1/sources/list/ необходимо также возвращать все источники JDBC, доступные пользователю.
Обработка SSL:
- При получении данных проверить наличие корневого сертификата, если флаг SSL включен
- Сформировать файлы хранилищ с правами доступа только для текущего процесса
- Записать полученные сертификаты и ключи во временные файлы
- Сгенерировать параметры для JDBC драйвера: пути к временным файлам, пароли к хранилищам
- Передать сгенерированные пути и параметры в загрузку
Обработка SSH:
- Инициализировать SSH-клиент в рамках сессии
- Выполнить подключение к SSH-серверу используя переданные учетные данные
- Выполнить аутентификацию
- Открыть туннель: связать свободный локальный порт на сервере приложения с парой <Внутренний хост БД>:<Внутренний порт БД>
- Получить фактический номер выделенного локального порта
- Сформировать строку JDBC URL, заменив оригинальный хост и порт на localhost и выделенный локальный порт
- Передать управление соединением и данные туннеля в модуль выполнения запроса Обеспечить разрыв SSH-соединения и закрытие туннеля сразу после завершения выполнения запроса или тестирования
Пользовательский интерфейс
- Название окна – "Новое подключение"
- Поле "Имя подключения" – текстовое поле, обязательно для заполнения.
- Раскрывающийся список "Драйвер" – список из реестра драйверов. Отображает элементы в формате: "Тип СУБД (Версия)". Если реестр пуст, список заблокирован с подсказкой при наведении: "Обратитесь к администратору для загрузки драйверов".
- Поле "URL подключения" – текстовое поле, обязательно для заполнения. Под полем располагается подсказка с форматом: "jdbc:<тип>://<хост>:<порт>/<база>".
- Поле "Логин" – текстовое поле.
- Поле "Пароль" – текстовое поле (символы маскируются звездочками, если пароль скрыт чекбоксом).
- Чекбокс "Показать пароль". По умолчанию включен.
- Переключатель "Использовать SSL". При включении отображаются поля:
- "Корневой сертификат" – кнопка "Загрузить файл" (принимает .pem, .crt). После загрузки отображается имя файла + иконка файла рядом с кнопкой.
- "Клиентский сертификат" (опционально) – кнопка "Загрузить файл". После загрузки отображается имя файла + иконка файла рядом с кнопкой.
- "Клиентский приватный ключ" (опционально) – кнопка "Загрузить файл". После загрузки отображается имя файла + иконка файла рядом с кнопкой.
- Переключатель "Использовать SSH-туннель". При включении отображаются поля (обязательны для заполнения):
- "SSH Хост" – текстовое поле
- "SSH Порт" – числовое поле (по умолчанию 22).
- "SSH Логин" – текстовое поле.
- "SSH Пароль" – текстовое поле.
- Кнопка "Проверить подключение"
- Кнопка "Сохранить"
- Кнопка "Назад"
Референс из AW BI:
Окно редактирования подключения аналогично окну создания подключения, кроме:
- Название окна – "Редактирование подключение"
- Внизу окна добавляется кнопка "Удалить подключение"
Окно удаления подключения – стандартное окно:
- Название окна – "Удалить соединение"
- Текст: "Действительно удалить соединение?"
- Кнопка "Удалить"
- Кнопка "Отмена"
Контекстное окно такого подключения аналогично контекстному окну подключения к БД:
Иконка такого подключения состоит из иконки БД с подписью JDBC:
Сценарии использования
Пользователь создает новый источник данных, выбирает тип "JDBC". Открывается окно ввода настроек подключения.
Пользователь выбирает установленный драйвер из списка, вводит URL, логин и пароль, нажимает "Проверить подключение". В случае ошибки появляется всплывающее сообщение с ошибкой. В случае успеха появляется всплывающее сообщение об успехе.
Пользователь включает SSL, нажимает "Загрузить файл" в полях для файлов и выбирает файлы с устройства. В интерфейсе отображаются выбранные файлы.
Пользователь включает SSH-туннель, вводит хост, порт, логин и пароль сервера. Пользователь снова нажимает «Проверить подключение». Система устанавливает туннель, проверяет соединение и возвращает успех.
После успешной проверки пользователь нажимает "Сохранить". Источник создан и добавлен в список слева.
Пользователь отменяет изменения и нажимает "Назад". Выполняется выход к окну выбора типа источника.
Пользователь редактирует JDBC-источник. Открывается окно редактирования, заполненное данными из БД.
Пользователь удаляет подключение. Открывается окно удаления соединения, после подтверждения подключение исчезает из списка и становится недоступным скриптах загрузки.
Системная логика (фронтенд)
При проверке подключения выполняется POST-запрос на тестирование подключения. Передает в себе все введенные данные формы, включая файлы сертификатов и SSH-параметры. Если в ответ получает ошибку, выводить всплывающее сообщение с ошибкой с бэкенда. В случае успеха выводить всплывающее сообщение с текстом: "Тест соединения пройден успешно". Окно не закрывается.
При создании подключения выполняется POST-запрос на создание источника. Передает введенные пользователем данные:
- Имя подключения
- ID драйвера JDBC
- URL
- Логин
- Пароль
- Флаг activeSSL и файлы сертификатов (если включено)
- Флаг activeSSH и параметры туннеля (если включено)
Если в ответ приходит ошибка валидации (например, запрещенные параметры в URL или отсутствие драйвера), выводить всплывающее сообщение с ошибкой. Окно не закрывается, данные сохраняются в полях
При редактировании подключения выполняется GET-запрос на данные этого источника. Все полученные данные записываются в соответствующие поля окна. При сохранении, если валидация и тест пройдены, выполняется PATCH-запрос. Передает id записи и только измененные поля.
- Если пользователь загрузил новый файл сертификата/ключа, он передается в запросе и заменяет старый на бэкенде.
- Если пользователь ввел новый пароль/SSH-пароль, он передается и шифруется заново.
- Если файлы не выбирались повторно, соответствующие поля не отправляются (бэкенд сохраняет прежние пути к файлам).
При удалении подключения выполняется DELETE-запрос, который передает в себе id удаляемой записи.
При открытии готового источника отправлять стандартный запрос GET back/api/v2/source/{sourceId}/tables.
При прокрутке готового источника отправлять стандартные запросы на превью N-строк.
Загрузка данных
Системная логика (бэкенд)
Логика работы событий по расписанию (cron) аналогична существующей логике загрузки по заданию:
- При наступлении времени расписания собрать полную конфигурацию источника из БД, сформировать задание на загрузку и отправить его во внутреннюю очередь обработки
- В случае ошибки формирования задачи или отправки в очередь зафиксировать ошибку для дальнейшего отображения в панели администратора
- В случае успеха при достижении очереди задания начнется загрузка данных
Логика получения таблиц JDBC-источника (до загрузки в БД проекта):
- Собрать полную конфигурацию источника из БД
- Взять соответствующий JDBC-драйвер из реестра драйверов
- Инициализировать SSH-туннель и SSL-контекст согласно сохраненным настройкам (используя файлы сертификатов)
- Сформировать запрос на просмотр первых 30 строк из целевой БД
- Отдать эти 30 строк на фронт стандартным методом
Логика загрузки данных в скрипте (в БД проекта) полностью аналогична загрузке из БД, за исключением необходимости открывать в начале и закрывать в конце SSH-туннель (если он выбран).
Ролевая модель
|
Доступ
|
Администратор системы
|
Администратор тенанта
|
Разработчик
|
|
Управление драйверами
|
Полный доступ. Загрузка, валидация, удаление, просмотр всех драйверов
|
Нет доступа. Только просмотр активных драйверов в тенанте
|
Нет доступа. Только просмотр активных драйверов
|
|
Управление подключениями
|
Полный доступ. Создание, редактирование, удаление любых источников в системе
|
Полный доступ в рамках тенанта. Создание, редактирование, удаление источников своего тенанта
|
Ограниченный доступ. Создание, редактирование, удаление источников своих проектов
|
|
Тестирование подключений
|
Доступно
|
Доступно
|
Доступно
|
|
Просмотр списка источников
|
Все источники системы
|
Только источники своего тенанта
|
Только источники своих проектов
|
|
Запуск ETL загрузок
|
Доступно. Для любых источников
|
Доступно. Только для источников своего тенанта
|
Опционально. Только перезапуск задач своих источников
|
|
Просмотр логов загрузки
|
Все логи системы
|
Логи источников своего тенанта
|
Логи своих задач загрузки
|






No Comments