Подходит ли аутентификация без сохранения состояния для подключения к базе данных для каждого пользователя? - PullRequest
0 голосов
/ 11 января 2019

выпуск

Я работаю над приложением, которое, как и многие другие приложения, начинает со страницы входа в систему, прежде чем показывать какие-либо данные.

Проблема в том, что мой клиент специально запросил, чтобы введенные учетные данные использовались для доступа к базе данных.

Это означает, что вместо запуска имени пользователя / пароля для таблицы «пользователь» они будут использоваться для получения персонального доступа к базе данных пользователя.

Мои начальники решили, что это приложение будет построено поверх скелета SpringBoot, в котором используется механизм аутентификации JWT без сохранения состояния.

Я не эксперт, когда дело доходит до сравнения преимуществ Stateless против Stateful, но если я правильно понял концепцию, это означает, что моему приложению потребуется восстанавливать соединение с базой данных при каждом отдельном запросе, верно?

Я спрашиваю об этом, потому что у нас очень медленное время отклика. Кажется, что код немного зависает в коде, связанном с настройкой базы данных, например

dataSrc.getConnection();

или

entityManagerFactoryBean.afterPropertiesSet();

Возможное решение?

Я слышал о StatelessSession Hibernate, но мне не удалось его настроить.

Я даже не уверен, что это вообще поможет, но из того, что я прочитал, он использует Hibernate API более низкого уровня, который может помочь смягчить проблему, без особого влияния на то, как все уже закодировано, так как Операции SQL являются исключительно вызовами хранимых процедур, которые вручную сопоставляются с объектами Java.

Что мне нужно помочь с

В принципе, я просто хочу получить ответы на 3 вопроса:

Вопрос 1: Должен ли я просто вернуться к проверке подлинности с сохранением состояния, поскольку модели без сохранения состояния не адаптированы к моему сценарию использования?

Вопрос 2 и 3: Может ли система StatelessSession быть реализована в моем сценарии, и будет ли она существенно влиять на время соединения с базой данных?

Но, конечно, если вы знаете о каком-либо другом указании, которое поможет мне решить мою проблему, не возвращая все это в Stateful, я это сделаю!

1 Ответ

0 голосов
/ 13 февраля 2019

Наконец-то пришло время ответить на этот вопрос (на случай, если кто-нибудь пройдет мимо в будущем).

По сути, у меня было два варианта: полностью удалить Hibernate или "вернуться" к сеансам с сохранением состояния.

Я выбрал первый вариант, который я мог сделать только потому, что у нас не было сопоставления на основе аннотаций между нашими объектами java и нашей базой данных. Going Stateful мог бы быть лучшим подходом, но я действительно не знал, как это сделать. Я обнаружил внушительное количество статей, в которых подчеркивается, как переходить без сохранения состояния, а не как возвращаться обратно с сохранением состояния и ... Ну ... Делать это в обратном направлении было бы недостаточно, так как мне не хватало бы большого количества настроек, поэтому я ' Я должен был исследовать это, и это была проблема, с которой у меня не было времени иметь дело.

Используя пользовательскую реализацию org.springframework.web.filter.GenericFilterBean , я обертываю каждый входящий запрос в пользовательский requestWrapper, содержащий соединение с базой данных. Я открываю / создаю указанное соединение, используя java (низкий) API: java.sql.DriverManager.getConnection

Затем я могу получить это соединение из своей обертки, которую Spring отправляет через приложение, используя этот код:

ServletRequestAttributes att = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()); ContentCachingRequestWrapper springWrapper = (ContentCachingRequestWrapper) att.getRequest(); CustomWrapper myWrapper = (CustomWrapper) springWrapper.getRequest(); myWrapper.getConnection();

Только не забудьте правильно закрыть все, чтобы избежать утечки памяти, и все готово. Также необходимо правильно зарегистрировать драйвер, просто вызвав конструктор указанного драйвера в главном классе приложения.

...