Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Delphi Новый топик    Ответить
 FireDac + PostgreSQL +SSPI как подружить?  [new]
Manfred
Member

Откуда:
Сообщений: 10
Коллеги привестствую!

Есть софт на Delphi XE7 написан. Компоненты доступа к базе - FireDAC.
База Postgres.

Раньше был настроен доступ через логин + пароль и работало норм.

Сейчас есть задача настроить аутентификацию входа в систему по доменному пользователю.

Сервер настроили.SSPI.
SQL Lite Manager for Postgres и PgAdmin - нормально коннектятся.

Клиент падает при попытке установить соединение.

Ошибка:
[FireDAC][Phys][PG][libpq] host name must be specified

Хост, порт - указаны.

Вместо libpq.dll из дистрибутива Postgres взял libpq.dll из комплекта SQL Lite Manager.
Через нее работает. Но она 1.5 МБ против 200кб от стандартных.
Как она собрана и что там внутри - неизвестно. Использовать нельзя.

В чем может быть проблема работы со стандартной?
Может опцию подключения надо прописать какую? Чтоб и с ней завелось?
30 июл 20, 17:02    [22175804]     Ответить | Цитировать Сообщить модератору
 Re: FireDac + PostgreSQL +SSPI как подружить?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50847

Manfred
В чем может быть проблема работы со стандартной?

В том, что на собрана без поддержки SSPI, очевидно.

Posted via ActualForum NNTP Server 1.5

30 июл 20, 17:11    [22175808]     Ответить | Цитировать Сообщить модератору
 Re: FireDac + PostgreSQL +SSPI как подружить?  [new]
Manfred
Member

Откуда:
Сообщений: 10
Dimitry Sibiryakov,

Про сборку с поддержкой LDAP видел что нужно ключ -LDAP.

А что нужно для SSPI?
30 июл 20, 17:18    [22175812]     Ответить | Цитировать Сообщить модератору
 Re: FireDac + PostgreSQL +SSPI как подружить?  [new]
Dimitry Sibiryakov
Member

Откуда:
Сообщений: 50847

Manfred
А что нужно для SSPI?

Задать вопрос в соответствующем разделе. Лично я могу только повторить за гуглем
https://wiki.postgresql.org/wiki/Configuring_for_single_sign-on_using_SSPI_on_Windows

Posted via ActualForum NNTP Server 1.5

30 июл 20, 17:32    [22175815]     Ответить | Цитировать Сообщить модератору
 Re: FireDac + PostgreSQL +SSPI как подружить?  [new]
Manfred
Member

Откуда:
Сообщений: 10
Поковырял исходники

https://github.com/postgres/postgres

В LibPq куча

#ifdef ENABLE_SSPI

но с другой стороны, нашлось и вот это:

/*
* Always build with SSPI support. Keep it as a #define in case
* we want a switch to disable it sometime in the future.
*/
#define ENABLE_SSPI 1

Сообщение было отредактировано: 30 июл 20, 18:27
30 июл 20, 18:30    [22175836]     Ответить | Цитировать Сообщить модератору
 Re: FireDac + PostgreSQL +SSPI как подружить?  [new]
Manfred
Member

Откуда:
Сообщений: 10
В общем, проблема решилась правкой исходников FireDac.

Внимательно прочитал доку:
https://postgrespro.ru/docs/postgrespro/11/libpq-connect#LIBPQ-CONNSTRING


Использование hostaddr вместо host позволяет приложению избежать поиска на сервере имён, что может быть важно для приложений, имеющих ограничения по времени. Однако имя компьютера требуется для методов аутентификации GSSAPI или SSPI,

Если указан hostaddr, а host не указан, тогда значение hostaddr даёт сетевой адрес сервера. Попытка подключения завершится неудачей, если метод аутентификации требует наличия имени компьютера.

я передавал имя хоста по IP.

Внес правки в:
function TFDPhysPgConnection.BuildPgConnectString(const AConnectionDef: IFDStanConnectionDef): String;

Было:
if AConnectionDef.HasValue(S_FD_ConnParam_Common_Server) then
  if IsIpAddress(oParams.Server) then
    Add('hostaddr=' + oParams.Server)
  else
    Add('host=' + oParams.Server);

стало:
if AConnectionDef.HasValue(S_FD_ConnParam_Common_Server) then
begin
  // if IsIpAddress(oParams.Server) then
  Add('hostaddr=' + oParams.Server);
  // else
  Add('host=' + oParams.Server);
end;


И заработало со стандартной либой.

Сообщение было отредактировано: 31 июл 20, 13:02
31 июл 20, 13:05    [22176123]     Ответить | Цитировать Сообщить модератору
Все форумы / Delphi Ответить