Доступ к базе данных через JPA с учетными данными конечного пользователя в Java EE - PullRequest
0 голосов
/ 08 июня 2018

Я работаю над проектом JavaEE с базами данных WildFly, Hibernate (JPA), C3P0 и MS SQL Server.

База данных - это устаревшая база данных, содержащая более тысячи объектов базы данных, таких как Stored Procedures, Functions, Views, Triggers и т. Д.Все эти объекты базы данных имеют детализированные разрешения, установленные на уровне User Role.

Теперь мне нужно получить доступ к этой базе данных с помощью веб-приложения JavaEE.Моя проблема в том, что обычная конфигурация JPA позволяет мне установить только одно имя пользователя / пароль для базы данных в файле конфигурации.Я не могу найти какой-либо способ настроить слой JPA, чтобы получить доступ к БД с помощью логина конечного пользователя.

В итоге я создал по одному EntityManagerFactory для каждого пользователя, вызвав

EntityManagerFactory entityManagerFactory = 
    Persistence.createEntityManagerFactory(properties_with_credentials_here)

один раз для каждого пользователя.

Проблема с этим подходом заключается в том, что он в основном будет создавать весь слой JPA для каждого пользователя и потреблять слишком много памяти.Конечно, я не использую какой-либо слой Cache.Память используется только для метаинформации сущностей (что очень много).

Теперь мой оригинальный вопрос: есть ли в JavaEE (JPA) какой-либо «стандартный» способ доступа к слою базы данных с помощью логина и пароля конечного пользователя?

Не могу поверить, что я первыйЧеловек столкнулся с этой ситуацией.Мне кажется, что «олицетворение» вполне нормально в .net веб-приложениях.Так что, я думаю, должен быть способ сделать это на Java.

Любые комментарии, советы или новые подходы приветствуются.

1 Ответ

0 голосов
/ 13 июня 2018

Стандартным способом в JavaEE является предоставление пользователю приложения для доступа к базе данных и получения прав доступа на основе пользователя посредством ролей в вашем приложении.

Если вам нужно полагаться на существующего пользователя базы данных,Ваш единственный шанс - установить соединение для каждого пользователя или для каждого запроса.Менеджер сущностей тогда действительно потребляет некоторую память, поскольку он предназначен для того, чтобы быть контекстом постоянства вашего приложения (и, следовательно, своего рода кешем).

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

...