Клиент JAVA Swing, доступ к данным в удаленной базе данных; Ibatis
-
05-07-2019 - |
Вопрос
У меня есть Java-клиент, которому нужен доступ к удаленной базе данных. Цель состоит в том, чтобы скрыть учетные данные базы данных от пользователя, а не жестко закодировать любые учетные данные в коде. Следовательно, доступ к базе данных, вероятно, должен быть на стороне сервера.
Я ограничен в использовании Ibatis в качестве структуры абстракции данных. Кроме того, на веб-сервере работает JBoss, что позволяет мне использовать источники данных.
Как бы вы разработали удаленный доступ к базе данных и сериализацию / десериализацию данных. Вы бы предпочли веб-сервисы какого-либо потока данных через сокет? Как бы вы реализовали оба варианта?
Решение
Создайте сервисный уровень и выставьте его поверх RMI - возможно, в виде сессионных компонентов EJB3 без состояния, как у вас JBoss, возможно, в виде чистого RMI. Я не стал бы беспокоиться о веб-сервисах, если у вас нет особых потребностей RMI возьмет на себя сериализацию за вас.
Ваш сервисный уровень должен предоставить метод для аутентификации пользователей с использованием их учетных данных, введенных при запуске приложения Swing. Все вызовы данных проходят через сервисный уровень. В приложении Swing нет SQL.
Существуют и другие преимущества этого механизма, помимо простого скрытия учетных данных базы данных. Вы не только получаете многоуровневую архитектуру, но и получаете эффективность, делясь подготовленными выписками между всеми вашими клиентами, имея единый источник данных на сервере.
Другие советы
То есть, вы хотите, чтобы пользователи имели доступ к базе данных, не зная учетных данных? Ваш единственный вариант - доступ к базе данных на стороне сервера. К сожалению, в Java нет способа скрыть имя пользователя и пароль - если вы поместите его в файл свойств и зашифруете его, решительный злоумышленник все равно сможет подключить отладчик и посмотреть, какие значения содержатся в вашем коде.
Кроме того, если вы не подключаетесь к БД через безопасное соединение, кто-то может запустить анализатор пакетов, например tcpdump, и получить там учетные данные.
Вы говорите, что используете сервер JBoss, и лучше всего было бы настроить удаленные EJB-компоненты, чтобы ваше клиентское приложение не обращалось к базе данных напрямую - оно должно проходить через ваши EJB-методы. (Между прочим, это не обязательно должен быть EJB, вы можете сделать что-нибудь, например, веб-сервисы, если хотите).
Дело в том, что ваш сервер общается с базами данных напрямую, а доступ вашего клиента - только через ограниченный набор интерфейсов, которые вы определяете на сервере.
Как уже было сказано, вам нужно подключиться к серверу, который обрабатывает соединение с базой данных. Невозможно эффективно предотвратить нарушение вашей безопасности с помощью 30 минут усилий.
Если клиенты подключаются несколько локально, в интрасети, использование EJB на вашем сервере приложений, вероятно, является лучшим выбором ... хотя вы, вероятно, хотите, чтобы сессионные компоненты не сохраняли состояние, я не обязательно обесценивал бы компоненты, управляемые сообщениями.
Для более длинных расстояний, когда трафик поступает извне, я бы использовал веб-сервисы через HTTPS
В любом случае большинство серверов приложений имеют механизмы для представления своих EJB-компонентов как веб-сервисов с помощью WSDL; и существует около ста утилит для генерации клиентов, для вызова веб-службы, из WSDL (достаточно хорошо работает wsdl2java для оси)