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