Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Java Новый топик    Ответить
 Подключение к БД от имени пользователя СУБД  [new]
ALEX.86
Member

Откуда:
Сообщений: 75
Доброго времени суток.

Разрабатываю REST API для legacy проекта. В проекте используется разграничение прав доступа к данным на уровне СУБД (Postgresql).

В JAVA используется spring boot и jpa. Пул соединений создаётся от имени суперпользователя.

Подскажите пожалуйста, каким образом можно перехватить момент получения соединения из пула, чтобы установить ему имя авторизированного пользователя?
18 мар 20, 22:58    [22101837]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
mad_nazgul
Member

Откуда:
Сообщений: 5179
ALEX.86
Доброго времени суток.

Разрабатываю REST API для legacy проекта. В проекте используется разграничение прав доступа к данным на уровне СУБД (Postgresql).

В JAVA используется spring boot и jpa. Пул соединений создаётся от имени суперпользователя.

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


Э-э-э зачем?
Это конечно можно, но тогда на сессию нужно создавать свой пулл соединений для сессии.
Т.е. надо будет перелопачивать кишки Spring-а.
ИМХО проще работать с пулом через суперпользователя, а разграничение делать на уровне сервисов.
19 мар 20, 04:49    [22101870]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
ALEX.86
В проекте используется разграничение прав доступа к данным на уровне СУБД (Postgresql).
это означает:
1. У вас десктоп проект или интранет проект. То есть юзверей не много.
2. Из п.п. 1 вытекает что пул вам не нужен вообще. Он только тогда, когда юзверей очень много.
3. Значит на каждую сессию свой коннект.
Как в клиент сервере.
19 мар 20, 07:21    [22101887]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
Alexey Tomin
Member

Откуда: Самара
Сообщений: 1847
ALEX.86

Разрабатываю REST API для legacy проекта. В проекте используется разграничение прав доступа к данным на уровне СУБД (Postgresql).

В JAVA используется spring boot и jpa. Пул соединений создаётся от имени суперпользователя.

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


Пул не поможет.
В целом есть две проблемы:
1. Коннект в java однопоточный, методы синхронизированы.
2. Создание коннекта это долгая операция.

Поэтому если делать так, как от Вас хотят- то надо создавать свой пул, который будет хранить коннекты с привязкой к пользователю, учитывать max_connections (вытеснять самые старые), обновлять коннекты (сервер отстреливает по таймауту) .

Либо переделать систему прав доступа и перенести её в Ваше API
19 мар 20, 07:35    [22101892]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
Alexey Tomin
надо создавать свой пул, который будет хранить коннекты с привязкой к пользователю
что нонсенс. Так как в пуле коннекты берет любой желающий.
19 мар 20, 07:43    [22101893]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
WGA
Member

Откуда:
Сообщений: 395
ALEX.86,

Поищите по словам "postgresql proxy authentication".

ЗЫ. Я смутно помню, что была библиотека (возможно, даже Apache'вская), которая реализовала требуемое Вам. Но, к сожалению, не нашел. Запомнил потому, что один мой приятель реализовал подобное, когда работал на госорганы, там были такие чуднЫе требования.

Сообщение было отредактировано: 19 мар 20, 08:46
19 мар 20, 08:45    [22101902]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
kolchanov
Member

Откуда: Питер
Сообщений: 185
Некоторые jdbc пулы позволяют выполнять дополнительные команды при получении коннекции из пула.
Например, tomcat jdbc pool поддерживает интерсепторы.
https://tomcat.apache.org/tomcat-8.0-doc/jdbc-pool.html#JDBC_interceptors

Напишите собственный интерсептор, в котором вызовите
set role
https://www.postgresql.org/docs/9.2/sql-set-role.html

Имя пользователя можно получать из thread local переменной, к примеру.
19 мар 20, 13:22    [22102134]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
mayton
Member

Откуда: loopback
Сообщений: 45469
ALEX.86
Доброго времени суток.

Разрабатываю REST API для legacy проекта. В проекте используется разграничение прав доступа к данным на уровне СУБД (Postgresql).

В JAVA используется spring boot и jpa. Пул соединений создаётся от имени суперпользователя.

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

Тебе пул не нужен. По сути старая схема работала как 1 коннекшен к БД == 1 пользователь.
Но поскольку архитектурно пул нельзя выкосить из современных систем системы (он скорее всего глубоко
интегрирован) - то надо создать столько пулов сколько было пользователей.

Программно конечно. Не вручную.

И желательно initial_connections поставить в 0 или 1 и максимум до 2. Нет смысла для каждого
юзера создавать 20 или 30 сеансов.
19 мар 20, 13:35    [22102140]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
kolchanov
Member

Откуда: Питер
Сообщений: 185
Все зависит от NFR-ов, как всегда.

Сколько конкурентных пользователей, какое максимальное latency на функцию и т.д.
Без этого - проработка архитектуры по кофейной гуще
19 мар 20, 13:46    [22102149]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
kolchanov,
Да все это на кофейной гуще и велосипедище.
И setrole тоже.
Чудо юдо велосипед делать пул на один коннект. Или на 10 коннектов, но с кодом: "я Вася"
19 мар 20, 13:56    [22102160]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
mayton
Member

Откуда: loopback
Сообщений: 45469
Лет 15 назад все двузвенки спокойно создавали DriverManager.getConnection
и не парились. Всё работало.

А на постгресе было коробочное решение пула. Кажется pg-bounсer.
19 мар 20, 16:16    [22102318]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
PetroNotC Sharp
Member

Откуда:
Сообщений: 4489
mayton,
И счас работает.
Только пул выкидывать, JNDI выкидывать.
И ip адрес писать в переменные самому, а не конфиги аппСервера.
19 мар 20, 16:35    [22102343]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
mayton
Member

Откуда: loopback
Сообщений: 45469
Мы разучились видеть простые решения.
19 мар 20, 16:38    [22102345]     Ответить | Цитировать Сообщить модератору
 Re: Подключение к БД от имени пользователя СУБД  [new]
ALEX.86
Member

Откуда:
Сообщений: 75
Всем большое спасибо. Сделал как советовали выше -> собственный интерсептор и set role
19 мар 20, 22:40    [22102610]     Ответить | Цитировать Сообщить модератору
Все форумы / Java Ответить